2013-07-21 234 views
1

我想從XML獲取數據。我知道的是,當我試圖找到的動物不在XML數據中時,我總是會得到一個錯誤。如圖所示。如何檢查XML值是否存在?

這是存儲在XML數據:

<?xml version="1.0" encoding="utf-8" ?> 
<Root> 
<Animal value="Elephant" size="2" name="Bob"> 
    <Action age="1" size="1">I am small</Action> 
    <Action age="2" size="1">I am growing up</Action> 
    <Action age="3" size="1">I'm 3 years old</Action> 
    <Action age="4" size="1">I'm BIG</Action> 
</Animal> 
</Root> 

這是C#代碼的一部分:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("animals.xml"); 
string animal = "Elephant"; 
MessageBox.Show(Convert.ToString(xDoc.SelectSingleNode("/Root/Animal[@value='" + animal + "']") 
            .Attributes["name"].InnerText)); 

當我改變

string animal = "Tiger"; 

我如何出現的錯誤解決數據不存在的錯誤?

+1

一個提示是找出'xDoc.SelectSingleNode()'返回你提供的不同值。 –

+0

在調用其上的任何方法之前,驗證'xDoc.SelectSingleNode(「/ Root/Animal [@ value ='」+ animal +「'」)「)是否爲'null'。 –

+0

你想從xml中獲得什麼?只有一個動物節點。您正在嘗試檢查它是否爲'value'屬性指定的值? –

回答

3

您可以使用LINQ到XML得到動物的名稱(它將返回null如果沒有被發現的動物):

XDocument xdoc = XDocument.Load("animals.xml"); 
string animal = "Elephant"; 

var name = xdoc.Root.Elements() 
       .Where(a => (string)a.Attribute("value") == animal) 
       .Select(a => (string)a.Attribute("name")) 
       .FirstOrDefault(); 

你也可以簡單地檢查是否任何動物匹配你的價值被發現,並得到名存實亡,如果有匹配:

var xpath = String.Format("Root/Animal[@value='{0}']", animal); 
var animalElement = xdoc.XPathSelectElement(xpath); 

if (animalElement != null) 
    MessageBox.Show((string)animalElement.Attribute("name")); 
+0

中獲得「Bob」;使用System.Xml的 ; using System.Xml.XPath; 我有所有這三款但錯誤說: 錯誤實例參數:無法從「System.Xml.XmlDocument」轉換爲「System.Xml.Linq.XNode」 錯誤「的System.Xml。 XmlDocument'不包含'XPathSelectElement'的定義,並且最好的擴展方法重載'System.Xml.XPath.Extensions.XPathSelectElement(System.Xml.Linq.XNode,string)'有一些無效參數 – MeowMeow

+0

@MeowMeow xdoc是一個'XDocument',而不是'XmlDocument'。那就是Linq to Xml,這對於xml解析更好用 –

+0

將其更改爲XDocument仍然不能使用XPathSelectElement – MeowMeow

2

您可以使用SelectNodes代替XmlNodeList,然後檢查其節點數。如果計數爲零,則表示「未找到節點」;否則,搶屬性,並將其打印:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("animals.xml"); 
string animal = "Tiger"; 
XmlNodeList theList = xDoc.SelectNodes("/Root/Animal[@value='" + animal + "']"); 
if (theList.Count == 1) { 
    MessageBox.Show(Convert.ToString(theList[0].Attributes["value"].InnerText)); 
} else if (theList.Count == 0) { 
    MessageBox.Show("No "+animal); 
} else { 
    MessageBox.Show("Multiple "+animal+"s"); 
} 
0

喜歡的東西

var animalNode = xDoc.SelectSingleNode("/Root/Animal[@value='" + animal + "']"); 
if (animalNode != null) 
{ 
    var valueAttr = animalNode.Attributes["value"]; 
    if (valueAttr != null) 
    { 
    MessageBox.Show(valueAttr.InnerText); //.value ??? 
    } 
}