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