我使用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></MethodName>
。
答案 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;
}