0

我正在使用 xpath 在 C# 中查询我的 xml 文件。

这是我的xml文件

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

我的 C# 代码是

XPathNavigator nav;
XPathDocument docNav;
XPathNodeIterator NodeIter;
String strExpression;

docNav = new XPathDocument(@"C:\\DCU\\XQUE.xml");

nav = docNav.CreateNavigator();
// This expression uses standard XPath syntax.

strExpression = "/bookstore[./book/price>35.00]";

NodeIter = nav.Select(strExpression);

while (NodeIter.MoveNext())
{
    Console.WriteLine("{0}", NodeIter.Current.OuterXml);
}

但我想得到这样的输出,

<bookstore>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

我认为我的 xpath 查询行缺少任何东西,请带我一条出路..

4

2 回答 2

1

该表达式选择<bookstore>元素,因此输出将是整体<bookstore>(及其所有子book元素)。如果您想要特定的书籍,您需要使用不同的 XPath

strExpression = "/bookstore/book[price>35.00]";

这将只打印<book>匹配的元素,但没有周围的<bookstore>标签。

于 2013-03-08T13:32:32.430 回答
1

您似乎误解了 XPath 选择的目的以及它可以做什么。XPath 不会为您创建一个全新的 XML 文档。获取 XML 输入并生成不同 XML 输出的典型选择是使用 XSLT。这将在你的情况下做到这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="book[price &lt;= 35]" />
</xsl:stylesheet>

如果您真的只想使用 C# 来执行此操作,您始终可以执行以下操作:

XPathNavigator nav;
XPathDocument docNav;
XPathNodeIterator NodeIter;
String strExpression;

docNav = new XPathDocument(@"C:\\DCU\\XQUE.xml");

nav = docNav.CreateNavigator();
// This expression uses standard XPath syntax.

strExpression = "/bookstore/book[price > 35.00]";

NodeIter = nav.Select(strExpression);

Console.WriteLine("<bookstore>");
while (NodeIter.MoveNext())
{
    Console.WriteLine("{0}", NodeIter.Current.OuterXml);
}
Console.WriteLine("</bookstore>");
于 2013-03-08T14:13:20.717 回答