繁体   English   中英

为什么此LINQ to XML不起作用?

[英]Why this LINQ to XML doesn't work?

我从外部来源收到此XML:

<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <response>
    <result code="1300">
      <msg>Command completed successfully; no messages</msg>
    </result>
    <trID>
      <clTRID>TEST-12345</clTRID>
      <svTRID>IRNIC_2011-09-21T13:44:25+04:30_f1u</svTRID>
    </trID>
  </response>
</epp>

我想提取result元素code属性 我使用以下代码:

XDocument doc = XDocument.Parse(response);
XNamespace ns = "urn:ietf:params:xml:ns:epp-1.0";
string value = doc.Descendants(ns + "result").First().Attribute("code").Value;

但是,它将引发空值异常,因为doc.Descendants(ns + "result")为空。

怎么了

但是,它会引发空值异常,因为doc.Descendants(ns +“ result”)为空

我不希望doc.Descendants 回一个null -它可能会返回一个空序列,但是这不会是一个“空值异常”。 同样, First() -它要么返回某物 ,要么抛出一个异常(尽管“某物”可以为null ,但我不期望Descendants会产生null )。 这样就留下了.Attribute("code").Value 现在是 如果属性不存在,则.Attribute("code") 可以返回null 如果您很高兴在这些情况下获得null ,我建议:

string value = (string)doc.Descendants(ns + "result").First().Attribute("code");

转换运算符处理空(不存在)属性。

没有复制。 您的代码基本上可以。

所以:调试。 打破声明,检查情况。

  • 您的doc加载吗?
  • doc.Descendants(ns + "result").First()提供什么?
  • 等等

检查response变量,因为我从xml文件加载了xml,并且您的代码运行良好。

在测试的情况下,您可以将响应保存在xml文件中,然后从那里加载它。

使用XDocument.Load("a.xml")加载xml文件。

也测试过了。 测试的最简单方法是下载LinqPad,创建新查询,然后为Language选择下拉菜单中的“ C#语句”。 单击运行,应使用提供的代码。 我还将检查“ Rased Dot Net”建议的响应变量

string xml =
@"<epp xmlns=""urn:ietf:params:xml:ns:epp-1.0"">
  <response>
    <result code=""1300"">
      <msg>Command completed successfully; no messages</msg>
    </result>
    <trID>
      <clTRID>TEST-12345</clTRID>
      <svTRID>IRNIC_2011-09-21T13:44:25+04:30_f1u</svTRID>
    </trID>
  </response>
</epp>";

XDocument doc = XDocument.Parse(xml);
Console.WriteLine(doc.ToString());
XNamespace ns = doc.Root.Name.Namespace;
Console.WriteLine("Namespace: " + ns.ToString());
string value = doc.Descendants(ns + "result").First().Attribute("code").Value;
Console.WriteLine(value);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM