如何在带名称空间的xml文件中获取节点

本文关键字:文件 xml 获取 节点 空间 | 更新日期: 2023-09-27 18:26:41

我正试图从XML文件中获取一个节点,但遇到了麻烦。XML:

<?xml version="1.0" encoding="UTF-8"?>
<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>26.0</apiVersion>
    <label>aaaWsPage2</label>
    <description></description>
    <rffolder>Robert Test</rffolder>
</ApexPage>

我尝试了以下代码:

var doc = new XmlDocument();
doc.Load(@"c:'test.xml");
var mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("ns1", @"http://soap.sforce.com/2006/04/metadata");
XmlElement root = doc.DocumentElement;
string query = @"/ns1:ApexClass/ns1:rffolder";
var xmlNode = root.SelectSingleNode(query);
if (xmlNode != null)
   Console.WriteLine(xmlNode.InnerXml);

xmlNode总是为null,或者我在.SelectSingleNode上得到一个异常。我在这里错过了什么?

如何在带名称空间的xml文件中获取节点

我总是发现Linq To Xml更容易使用

var xDoc = XDocument.Load(fname);
XNamespace ns = "http://soap.sforce.com/2006/04/metadata";
var folder = xDoc.Root.Element(ns + "rffolder").Value;

你能试试这个吗?

XmlElement root = doc.DocumentElement.SelectSingleNode(@"//ns1:ApexClass/ns1:rffolder) as XmlElement;

您可以使用LinqToXml

 var node = XElement.Load(@"C:'Test.xml")
                    .Element(XName.Get("rffolder","http://soap.sforce.com/2006/04/metadata"));

如果您不想使用Linq2Xml:

首先,在XML中,根被称为ApexPage,而不是ApexClass,并且您忘记将XmlNamespaceManager传递给SelectSingleNode。

因此:

string query = @"/ns1:ApexPage/ns1:rffolder";
var xmlNode = root.SelectSingleNode(query, mgr);

也应该工作

尝试将查询字符串更改为:

string query = "//ns1:ApexClass/ns1:rffolder";