[英]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.