如何到达命名空间的xml文件中的节点?

时间:2013-08-05 22:17:46

标签: c# .net xml xml-namespaces

我正在尝试从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上收到例外。我在这里缺少什么?

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

你能试试吗?

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

答案 2 :(得分:1)

您可以使用LinqToXml

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

答案 3 :(得分:1)

如果您不想使用Linq2Xml:

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

所以:

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

也应该有用

答案 4 :(得分:0)

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

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