如何使用命名空间获取XML中的节点值,如果找不到节点则不抛出异常?

时间:2014-02-26 13:18:49

标签: c# xml linq-to-xml

我使用LinqToXml获取名称为GUID的注释的值。所以XML看起来像这样:

<xml>
   <node1>
      <GUID>123948390</GUID>
   </node1>
<xml>

它也可以嵌套到更多节点中。每个可能的XML字符串只有一个GUID。

我要做的是解析XML以收集GUID元素。我正在解析的XML可能包含也可能不包含GUID元素。如果它不包含GUID元素,我希望它返回一个空字符串。

我尝试的是:

 doc.Elements().Where(e => e.Name.LocalName == "GUID").Single().Value;

其中doc是XDocument,但如果找不到任何内容,则找不到该值并抛出异常。如何获取GUID元素的值并确保在没有找到任何内容时不会抛出任何异常?

/编辑

  var doc = XDocument.Parse(xmlString);
            this.RequestId =  (string)doc.Descendants("GUID").SingleOrDefault() ?? 
                     String.Empty;

始终返回空字符串。即使有GUID。

xmlString如下所示:<?xml version=\"1.0\" encoding=\"utf-8\"?><MethodName xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\><GUID>blabla</GUID></Meth‌odName>

2 个答案:

答案 0 :(得分:3)

如果要搜索所有文档,则应使用Descendants。如果文档中没有这样的元素,您可以将元素转换为字符串以获取其值而不会出现NullReferenceException:

var guid = (string)doc.Descendants("GUID").SingleOrDefault() ?? String.Empty;

var guid = doc.Descendants("GUID")
              .Select(g => (string)g)
              .SingleOrDefault(String.Empty);

或者使用XPath

var guid = (string)doc.XPathSelectElement("//GUID") ?? String.Empty;

注意:如果您在真实的xml文档中定义了默认的xml命名空间,那么您应该提供命名空间来获取元素名称:

var ns = doc.Root.GetDefaultNamespace();
var guid = (string)doc.Descendants(ns + "GUID").SingleOrDefault() ?? "";

答案 1 :(得分:2)

如果找不到您的元素,它将返回null。 Single不允许使用null。

使用SingleOrDefault返回null,然后测试该空条件......

var element = doc.Elements()
    .Where(e => e.Name.LocalName == "GUID")
    .SingleOrDefault();

if(element != null) {
    return element.Value;
}