2012-10-18 40 views
1
<?xml version="1.0"?> 

-<bookstore>    
     <book > 
      <title>aaaa</title> 
      -<author > 
       <first-name>firts</first-name> 
       <last-name>last</last-name> 
      </author> 
      <price>8.23</price> 
      <otherbooks> 
        <book > 
         <title>bbb</title>  
         <price>18.23</price> 
        </book>  
        <book > 
         <title>ccc</title>  
         <price>11.22</price> 
        </book>  
      </otherbooks> 
     </book> 
</bookstore> 

我想选择不同层次的所有书籍,然后显示每个书籍(作者,书名和价格)的相关信息。目前,代码还会显示第一本书的其他书籍。什么是仅显示所需信息的最佳方式。 我需要使用XPath。xpath显示来自不同层次的节点的数据

xPathDoc = new XPathDocument(filePath); 
xPathNavigator = xPathDoc.CreateNavigator(); 
XPathNodeIterator xPathIterator = xPathNavigator.Select("/bookstore//book"); 
foreach (XPathNavigator navigator in xPathIterator) 
{ 
    XPathNavigator clone = navigator.Clone(); 
    clone.MoveToFirstChild(); 

    Console.WriteLine(clone.Name + " : " + clone.Value); 
    while (clone.MoveToNext()) 
    { 
     Console.Write(clone.Name + " : " + clone.Value + " | "); 
    } 
} 
+0

你是什么意思与“不同层次”?你的选择器检索''元素在''以下的所有级别。你不想要选择“书/其他书/书”吗? – hielsnoppe

+0

我想要选择所有的书籍,但我想显示有关每本书的信息,此刻第一本书还包括信息,然后再次显示在自己的 – witpo

+0

那么是你目前的解决方案打破,或者你想要改善它?我认为你目前的选择器应该能够实现你所描述的。 – hielsnoppe

回答

1

如果你是开放的尝试的LINQ到XML:

var xDoc = XDocument.Parse(xml); //or XDocument.Load(filename) 
var books = xDoc.Root.Elements("book") 
      .Select(b => new 
      { 
       Author = b.Element("author").Element("first-name").Value + " " + 
          b.Element("author").Element("last-name").Value, 
       Books = b.Descendants("book") 
          .Select(x => new 
          { 
           Title = x.Element("title").Value, 
           Price = (decimal)x.Element("price"), 
          }) 
          .Concat(new[] { new { Title = b.Element("title").Value, 
               Price = (decimal)b.Element("price") } 
             }) 
          .ToList() 

      }) 
      .ToList(); 
+0

它看起来不错,但我试图熟悉Xpath。我将在后面看linq到xml。谢谢 – witpo

1

双斜线(//)被指定all descendents,不只是眼前的一个。怎么样

/bookstore/book 

?那只会让你成为顶级book

+0

我想获得所有的书籍(代码工作正常),并迭代它们并显示(作者,标题和价格)为每一个。目前,我还在为第一本书显示数据。我想避免这种情况。但我看不到通过XPathNavigator进行迭代访问书籍节点的更好方法。克隆 – witpo