2011-04-18 106 views
2

这是一个简单的任务,但我不能让它工作。鉴于以下XML:如何按名称获取节点?

<?xml version="1.0" encoding="UTF-8"?> 
<product> 
    <item1></item1> 
    <item2></item2> 
    <item3></item3> 
</product> 

我想获得product内的所有节点。继两次试图返回任何节点,我不明白为什么:

XDocument meteoDoc = XDocument.Load("data.xml"); 
foreach (var item in meteoDoc.Descendants("product")) {//...} 
foreach (var item in meteoDoc.Descendants().Where(x => x.Name == "product").Nodes()) {//...} 

以下,符合市场预期,将返回我的所有节点:

foreach (var item in meteoDoc.DescendantNodes()) { //...} 

THX对于任何的窍门,我看不到问题... ...: -/

回答

4

你的第一次尝试是要求所有的Descendants叫做product。你的第二次尝试是找到所有后代的直接子节点,称为product

这可能是因为它在寻找内根元素...后裔如果你知道根元素被称为product,你可以只使用:

foreach (var item in meteoDoc.Root.Descendants()) 

(我不能测试现有的代码,以找出究竟为什么它不为你工作,现在,恐怕)

注意Descendants只能找到传人元素 - 如果你希望所有后代节点,您需要DescendantNodes方法。

+0

是的,产品实际上是在这种情况下的根,工作正常。 – sl3dg3 2011-04-18 13:24:54

1

使用此:

XDocument meteoDoc = XDocument.Load("data.xml"); 
foreach (var item in meteoDoc.Root.Descendants()) 
{ 
    // ... 
} 
0

试试这个:

 foreach (var item in meteoDoc.Descendants("product")) 
     { 
      foreach (var prod in item.Descendants()) 
      { 
       // do something 
      } 
     } 
0

我已经对XML的几个变化,这种方式更良好形成的数据,我可以给你一段代码,完成你的任务。

static void Main(string[] args) 
    { 

     //Data.xml 
     /* 
     <?xml version="1.0" encoding="UTF-8"?> 
      <product> 
       <item> 
        <name>test</name> 
       </item> 
       <item> 
        <name>test2</name> 
       </item> 
       <item> 
        <name>test3</name> 
       </item> 
      </product> 
     */ 


     XDocument meteoDoc = XDocument.Load("data.xml"); 

     var result = from c in meteoDoc.Descendants("item") 
        select new { Name = c.Element("name").Value }; 

     foreach (var item in result) 
     { 
      Console.WriteLine(item.Name); 
     } 
+0

由于是从第三方提供的,所以我对它所描述的数据没有任何影响。无论如何。 – sl3dg3 2011-04-18 13:26:22