1

我正在尝试从 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始终为空,否则我在.SelectSingleNode. 我在这里想念什么?

4

5 回答 5

4

我总是发现 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;
于 2013-08-05T22:25:41.097 回答
2

你能试试这个吗?

XmlElement root = doc.DocumentElement.SelectSingleNode(@"//ns1:ApexClass/ns1:rffolder) as XmlElement;
于 2013-08-05T22:23:15.890 回答
1

您可以使用 LinqToXml

 var node = XElement.Load(@"C:\Test.xml")
                    .Element(XName.Get("rffolder","http://soap.sforce.com/2006/04/metadata"));
于 2013-08-05T22:29:21.697 回答
1

如果您不想使用 Linq2Xml:

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

所以:

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

也应该工作

于 2013-08-05T22:38:20.950 回答
0

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

string query = "//ns1:ApexClass/ns1:rffolder";
于 2013-08-05T22:24:46.413 回答