我从服务中收到以下字符串作为列表
<?xml version =“1.0”encoding =“UTF-8”standalone =“yes”?>< feed version =“0.3”xmlns =“http://purl.org/atom/ns#”><条目>&安培; …
你有一些问题:
你正在使用旧的 XmlDocument API对名称空间的处理有些不方便。特别:
XmlDocument
XmlNode.GetElementsByTagName(string) 是 命名空间,不知道 。它匹配“原始”限定元素名称,可能包括前缀。
XmlNode.GetElementsByTagName(string)
在这种方法中,微软写道 文件
注意 建议您使用 XmlNode.SelectNodes 要么 XmlNode.SelectSingleNode 方法而不是 GetElementsByTagName 方法。
注意
建议您使用 XmlNode.SelectNodes 要么 XmlNode.SelectSingleNode 方法而不是 GetElementsByTagName 方法。
XmlNode.SelectNodes
XmlNode.SelectSingleNode
GetElementsByTagName
XmlNode.SelectSingleNode(string) 相反, 是名称空间感知 并仅选择空命名空间中的元素。
XmlNode.SelectSingleNode(string)
来自 文档 :
如果XPath表达式不包含前缀,则假定名称空间URI为 的 空命名空间 强> 。如果您的XML包含默认命名空间,您仍必须使用 XmlNamespaceManager 并为其添加前缀和名称空间URI;否则,您将无法获得所选节点。
XmlNamespaceManager
这两种方法之间的这种不一致性解释了为什么您的代码部分有效,因为XML文档中的所有元素都属于 http://purl.org/atom/ns# 命名空间。
http://purl.org/atom/ns#
如果你缩进你的XML,那么很明显 <name> node嵌套在容器中 <author> 节点:
<name>
<author>
<feed version="0.3" xmlns="http://purl.org/atom/ns#"> <entry> <id>1</id> <title>Job 1</title> <author> <name>Jim James</name> </author> <modified>2018-08-10T14:50:46-04:00</modified> </entry> <!--Other entries omitted --> </feed>
你的来电 SelectSingleNode("name") 由于存在这种干预因素,也会失败。
SelectSingleNode("name")
因此,以下代码将正常工作并正确选择您的条目名称:
var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(response); //assuming response is above xml string var manager = new XmlNamespaceManager(xmlDoc.NameTable); manager.AddNamespace("atom", @"http://purl.org/atom/ns#"); var parentNode = xmlDoc.DocumentElement.SelectNodes("./atom:entry", manager); foreach (XmlNode childrenNode2 in parentNode) { var name = childrenNode2.SelectSingleNode("./atom:author/atom:name", manager)?.InnerText ?? ""; Console.WriteLine(name); }
样品小提琴#1 这里 。
顺便说一句,这可以更方便地完成 LINQ to XML API,完全避免使用 XmlNamespaceManager 和XPath和诸如此类的:
var xmlDoc = XDocument.Parse(response); var ns = (XNamespace)@"http://purl.org/atom/ns#"; foreach (var element in xmlDoc.Root.Elements(ns + "entry")) { var name = element.Element(ns + "author")?.Element(ns + "name")?.Value ?? ""; Console.WriteLine(name); }
样品小提琴#2 这里 。
给出的示例不是有效的XML:
由于上述任何原因,我不希望这个解析。
然而,NullReferenceException没有正确地传达失败的原因,所以这里可能还有其他东西。使用调试器确定引发此异常的行。
假设您错过了一些XML并且它实际上是有效的,这也可能是由于未指定您要选择的元素的命名空间引起的。如果文档具有目标命名空间 http://some-namespace , entry 选择的名称不正确;您必须包含命名空间。 GetElementsByTagName 有一个 带有两个参数的重载 ,其中第二个是命名空间。
http://some-namespace
entry