2012-10-18 78 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