我从外部来源收到此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(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")
为空。
这里有什么问题?
答案 0 :(得分:3)
但是,它抛出null值异常,因为doc.Descendants(ns +“result”)为null
我不希望doc.Descendants
永远返回null
- 它可能会返回一个空序列,但这不会是“空值异常”。同样地,First()
- 它返回某些内容,或者它会引发异常(虽然“某些内容”可能是null
,但我不希望Descendants
会产生null
s。离开.Attribute("code").Value
。现在是的;如果某个属性不存在,则.Attribute("code")
可以返回null
。如果您愿意在这些情况下获得null
,我建议:
string value = (string)doc.Descendants(ns + "result").First().Attribute("code");
转化运算符处理空(不存在)属性。
答案 1 :(得分:1)
没有重复。你的代码基本上没问题。
所以:调试。打破陈述并检查事情。
doc
已加载好吗?doc.Descendants(ns + "result").First()
提供什么?答案 2 :(得分:1)
检查response
变量,因为我从xml文件加载了xml,而且代码运行良好。
如果是测试,您可以将响应保存在xml文件中并从那里加载。
使用XDocument.Load("a.xml")
加载xml文件。
答案 3 :(得分:1)
也测试了这一点。最简单的测试方法是下载LinqPad,创建新查询,然后为语言从下拉列表中选择“C#statement(s)”。单击“运行”,应该使用提供的代码。我还会按照“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);