2013-08-05 47 views
1

我想從XML文件中獲取一個節點並且有一段時間。 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異常。我在這裏錯過了什麼?

+0

你是不是使用LINQ to XML的原因嗎?該語法更易於使用。 – Jay

+0

@Jay Care向我展示一個例子?我從來沒有使用過XML的Linq。 – AngryHacker

+0

@ I4V擊敗了我。 – Jay

回答

4

我總是發現的LINQ到XML的使用更加方便

var xDoc = XDocument.Load(fname); 
XNamespace ns = "http://soap.sforce.com/2006/04/metadata"; 

var folder = xDoc.Root.Element(ns + "rffolder").Value; 
2

你能試試嗎?

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

試着改變你的查詢字符串:

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

您可以使用LinqToXml

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

如果您不想使用Linq2Xml:

首先,在XML中,根稱爲ApexPage,而不是ApexClass,並且您忘記將XmlNamespaceManager傳遞給SelectSingleNode。

所以:

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

應該工作以及

相關問題