清理 XML LINQ 查询
本文关键字:查询 LINQ XML 清理 | 更新日期: 2023-09-27 18:35:51
这是这个问题的一个分支 卡在基本的Linq到XML查询上
我正在努力更好地编写 LINQ 并学习 LINQ to XML。LINQ 查询返回预期的结果,但代码看起来不干净。有没有更好的写法?
.XML
<ApiResponse xmlns="http://api.namecheap.com/xml.response" Status="OK">
<Errors/>
<Warnings/>
<RequestedCommand>namecheap.domains.check</RequestedCommand>
<CommandResponse>
<DomainCheckResult Domain="gooaagle.com" Available="true"/>
</CommandResponse>
<Server>WEB1-SANDBOX1</Server>
<GMTTimeDifference>--4:00</GMTTimeDifference>
<ExecutionTime>0.859</ExecutionTime>
</ApiResponse>
C#
XNamespace ns = "http://api.namecheap.com/xml.response";
var response = (
from r in doc.Elements()
select new
{
Errors = r.Element(ns + "Errors").Value,
Warnings = r.Element(ns + "Warnings").Value,
RequestedCommand = r.Element(ns + "RequestedCommand").Value,
CommandResponse = new
{
Domain= r.Element(ns + "CommandResponse").Element(ns + "DomainCheckResult").Attribute("Domain"),
Available = r.Element(ns + "CommandResponse").Element(ns + "DomainCheckResult").Attribute("Available")
},
Server = r.Element(ns + "Server").Value
});
好吧,您无缘无故地使用查询表达式,并且您有不必要的括号和很长的行......但除此之外,它看起来还可以。使其更简洁的一种选择是避免使用匿名类型 - 创建一个类(例如 ApiResponse
) 使用FromXElement
方法,允许您编写:
var response = doc.Elements().Select(x => ApiResponse.FromXElement(x));
或者在 C# 4 中:
var response = doc.Elements().Select(ApiResponse.FromXElement);
然后,可以将投影从查询中取出,并以普通方法编写它。你可以把它分成几个语句,也可以不分解——这是你的决定。
顺便说一下,目前还不清楚你是否真的期望有多个元素 - 一个文档只能有一个顶级元素,如果你真的只期望根元素有用,那么完全摆脱查询部分。
您可能还会发现避免代码中的字符串文字(和重复ns + ...
更清晰,如下所示:
private static readonly XNamespace ResponseNs =
"http://api.namecheap.com/xml.response";
private static readonly XName ErrorsName = ResponseNs + "Errors";
private static readonly XName WarningsName = ResponseNs + "Warnings";
// etc
然后,您可以使用:
Errors = r.Element(ErrorsName).Value