【问题标题】:xpath display data from nodes at different levelsxpath 显示来自不同级别节点的数据
【发布时间】:2012-10-18 09:29:38
【问题描述】:
<?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。

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 + " | ");
     }
} 

【问题讨论】:

  • “不同级别”是什么意思?您的选择器检索&lt;bookstore /&gt; 以下所有级别的&lt;book /&gt; 元素。您不想选择book/otherbooks/book 吗?
  • 我希望选择所有书籍,但我想在第一本书还包括 信息时显示每本书的信息,然后 再次单独显示
  • 那么您当前的解决方案是否已损坏,或者您想改进它吗?我认为您当前的选择器应该达到您所描述的效果。
  • 选择所有书籍工作正常。在使用 XPathNavigator 进行迭代时,我遇到了如何显示每本书的信息的问题。我的解决方案太深入了,当第一本书应该只显示(作者、标题和价格)时显示
  • 如果您能想到使用 XPath 的更好方法,请告诉我。

标签: c# xpath


【解决方案1】:

如果您愿意尝试 Linq To 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();

【讨论】:

  • 它看起来不错,但我正在努力让自己熟悉 Xpath。稍后我将研究 linq to xml。谢谢
【解决方案2】:

双斜杠 (//) 指定 all descendents,而不仅仅是直接的。怎么样

/bookstore/book 

?这只会让您获得顶级 book

【讨论】:

  • 我想获取所有书籍(代码工作正常)并对其进行迭代并显示每本书的(作者、标题和价格)。目前,我还在显示第一本书的 数据。我想避免这种情况。但是我看不到通过使用 XPathNavigator 克隆进行迭代来访问书籍节点的更好方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多