如何在带名称空间的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
上得到一个异常。我在这里错过了什么?
我总是发现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";