您没有处理文档中存在的名称空间。具体来说,高级元素:
<ABRSearchByABNResponse xmlns="http://abr.business.gov.au/ABRXMLSearch/">
places ABRSearchByABNResponse
,及其所有子元素(除非被另一个元素覆盖xmlns
) 进入命名空间http://abr.business.gov.au/ABRXMLSearch/
。为了导航到这些节点(无需像GetElementsByTagName
或使用local-name()
),您需要使用以下方式注册名称空间XmlNamespaceManager
,像这样。这xmlns
别名不一定需要与原始文档中使用的别名相匹配,但这样做是一个很好的约定:
Xml文档
var xdoc = new XmlDocument();
var ns = new XmlNamespaceManager(xdoc.NameTable);
ns.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
ns.AddNamespace("abr", "http://abr.business.gov.au/ABRXMLSearch/");
xdoc.LoadXml(ipxml);
// NB need to use the overload accepting a namespace
var xresponse = xdoc.SelectSingleNode("//abr:response", ns);
var xlist = xdoc.SelectNodes("//abr:mainName/abr:organisationName", ns);
X文档
最近,可以利用 LINQ 的强大功能X文档 https://stackoverflow.com/a/1542101/314291,这使得使用命名空间变得更加容易(Descendants
查找任意深度的子节点)
var xdoc = XDocument.Parse(ipxml);
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace abr = "http://abr.business.gov.au/ABRXMLSearch/";
var xresponse = xdoc.Descendants(abr + "response");
var xlist = xdoc.Descendants(abr + "organisationName");
XDocument + XPath
你也可以诉诸使用 XPath https://stackoverflow.com/a/27583026/314291在 Linq to Xml 中,特别是对于更复杂的表达式:
var xdoc = XDocument.Parse(ipxml);
var ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
ns.AddNamespace("abr", "http://abr.business.gov.au/ABRXMLSearch/");
var xresponse = xdoc.XPathSelectElement("//abr:response", ns);
var xlist = xdoc.XPathSelectElement("//abr:mainName/abr:organisationName", ns);