2013-04-09 17 views
4

我已經看了很多資源,做了大量的研究,並且嘗試了許多「最佳猜測」來一次訪問使用WebMatrix與C#,網頁的單個元素,但是我所嘗試的並沒有得到通過。如何使用帶WebMatrix的C#.net Web頁訪問單個XML元素的值?

考慮一個簡單的XML文檔,看起來像這樣:

<root> 
    <requisitionData> 
     <element1>I am element 1</element1> 
     <element2>I am element 2</element2> 
    </requisitionData> 
</root> 

我知道我可以使用foreach循環,就像這樣:

@using System.Xml.Linq 

XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml")); 

foreach (XElement element in doc.Descendants("requisitionData")) 
{ 
    @element.Value 
} 

而這,當然,做工精細。但是如果我只是想將單個元素<element1>的值存儲在字符串變量中呢?我看了這裏(下面的鏈接),但我不能讓這個代碼的正面或反面(它幾乎看起來像C#對我來說,但是,然後再次,我是新來解析XML .. 。):

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b14ce4d1-77f1-420d-ad91-0989794a1d45/

我也曾經到過這裏:How to Get XML Node from XDocument

但顯示的代碼是沒有意義的,我在這裏無論是。我一直認爲必須有一個更簡單的方法來做到這一點,希望沒有學習一種全新的查詢方法。

---------------------------------我試過的東西-------- -------------------------

XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml")); 

string element = doc.Descendants("requisitionData").Descendants("element1").Value; 

錯誤我得到:使用指令或組件引用

XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml")); 

XElement element = doc.Descendants("element1"); 
string val = element.Value; 
「缺

我收到的錯誤:無法隱式地將類型'System.Collections.Generic.IEnumerable'轉換爲'System.Xml.Linq.XElement'。存在顯式轉換(您是否缺少轉換?)

我確實嘗試了其他的東西,但是我得到的錯誤與上面顯示的差不多。我是否比這更難,還是我簡化了它?

------------------------- UPDATE -------------------- ----------

我能得到這個工作:

string element = doc.Element("root").Element("requisitionData").Element("element1").Value; 

@element 

然而,有一件事我關注這個方法的缺點是.Element選擇「第一」的比賽,所以在XML文檔中,看起來像這樣:

<root> 
    <requisitionData> 
     <element1>I am element 1</element1> 
     <element2>I am element 2</element2> 
    </requisitionData> 
    <requisitionData> 
     <element1>I am element 1</element1> 
     <element2>I am element 2</element2> 
    </requisitionData> 
</root> 

我怎麼能訪問第二次出現0?

+0

有這個問題後解決了幾天(感謝下面的答案),我不得不說,使用XPathSelectElement(s)似乎是要走的路。 XPath功能強大(比我意識到的方式更精確),並且完全靈活,無論我需要單個元素還是多個元素。 – VoidKing 2013-04-12 13:25:42

回答

4
@using System.Xml.Linq 

XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml")); 

foreach (XElement element in doc.Element("root").Element("requisitionData").Descendants()) 
{ 
    string value = element.Value; 
} 

或使用XPath:

@using System.Xml.Linq 
@using System.Xml.XPath 

XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml")); 

foreach (XElement element in doc.XPathSelectElement("//requisitionData").Descendants()) 
{ 
    string value = element.Value; 
} 

UPDATE:

如果你想從你的更新,例如選擇例如第二<element1>節點:

string value = doc.XPathSelectElement("//requisitionData[2]/element1").Value; 
+0

感謝您的答案,但我明確只想要一個單一的元素,從而減少代碼「循環」的需要 – VoidKing 2013-04-09 14:01:18

+0

此外,我不明白這是如何選擇一個單一的元素。給定foreach循環條件,會有多個結果迭代。 – VoidKing 2013-04-09 14:21:30

+0

您想要XML中的哪個特定節點?您可以使用我在答案中顯示的XPath示例獲取您喜歡的任何特定節點。例如,如果你想獲得第一個''節點的值,你應該寫成'string value = doc.XPathSelectElements(「// requisitionData/element1」)。First()。Value;'。 – 2013-04-09 21:01:34

相關問題