2010-11-15 67 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