清理 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
    });

清理 XML LINQ 查询

好吧,您无缘无故地使用查询表达式,并且您有不必要的括号和很长的行......但除此之外,它看起来还可以。使其更简洁的一种选择是避免使用匿名类型 - 创建一个类(例如 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