1

这是这个问题的一个分支Stuck on basic Linq to XML query

我正在努力提高编写 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
    });
4

1 回答 1

2

好吧,您无缘无故地使用查询表达式,并且有不必要的括号和很长的行……但除此之外,它看起来还不错。使其更简洁的一种选择是避免使用匿名类型 - 创建一个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
于 2012-05-31T18:51:18.957 回答