2010-11-15 69 views
1

我一直在嘗試讀取一個xml文件。我必須提取節點「Date」和「Name」的值,但問題是,它們可能出現在XML層次結構中的任何級別。讀取具有未知根/父節點的XML節點的問題

所以,當我嘗試使用此代碼,

 XmlDocument doc = new XmlDocument(); 
     doc.Load("test1.xml"); 
     XmlElement root = doc.DocumentElement; 
     XmlNodeList nodes = root.SelectNodes("//*"); 
     string date; 
     string name; 

     foreach (XmlNode node in nodes) 
     { 
        date = node["date"].InnerText; 
        name = node["name"].InnerText; 
     } 

和XML文件是::

<?xml version="1.0" encoding="utf-8"?> 
<root> 
<child> 
    <name>Aravind</name> 
    <date>12/03/2000</date> 
</child> 
</root> 

上面的代碼中的錯誤了,因爲<name><date>不是直接子元素根
是否有可能假設父節點/根節點是未知的,並且只是以節點的名稱,複製值

回答

2

根據您所得到的例外情況,這可能是也可能不是確切的解決方案。不過,我肯定會檢查datename之前存在的.InnerText

foreach (XmlNode node in nodes) 
    { 
       dateNode = node["date"]; 
       if(dateNode != null) 
        date = dateNode.InnerText; 
       // etc. 
    } 
+0

有必要的基本編輯和變通,答案可以接受。 :) @Mark。感謝寶貴的職位。 – 2010-11-15 14:39:44

2

我將在XPath和XPATH宣讀了對C#這樣做更有效地

http://support.microsoft.com/kb/308333

http://www.w3schools.com/XPath/xpath_syntax.asp

這裏是一個應該讓你輕鬆獲得的innerText一個小方法。

function string GetElementText(string xml, string node) 
{ 
    XPathDocument doc = new XPathDocument(xml); 
    XPathNavigator nav = doc.CreateNavigator(); 

    XPathExpression expr = nav.Compile("//" + node); 
    XPathNodeIterator iterator = nav.Select(expr); 

    while (iterator.MoveNext()) 
    { 
     // return 1st but there could be more 
     return iterator.Current.Value;    
    } 
} 
+0

感謝寶貴的時間和答案。 :) – 2010-11-15 14:40:06

1

嘗試使用LINQ:

 string xml = @"<?xml version='1.0' encoding='utf-8'?> 
         <root> 
         <date>12/03/2001</date> 
         <child> 
         <name>Aravind</name> 
         <date>12/03/2000</date> 
         </child> 
         <name>AS-CII</name> 
         </root>"; 

     XDocument doc = XDocument.Parse(xml); 

     foreach (var date in doc.Descendants("date")) 
     { 
      Console.WriteLine(date.Value); 
     } 

     foreach (var date in doc.Descendants("name")) 
     { 
      Console.WriteLine(date.Value); 
     } 

     Console.ReadLine(); 

子孫方法可以讓你得到所有具有指定名稱的元素。

+0

你能告訴我應該使用哪個命名空間嗎? – 2010-11-15 14:48:13

+0

添加System.Xml.Linq作爲參考,也作爲使用。 – 2010-11-15 14:51:58