c#中具有相对顶级节点的Xpath选择查询

本文关键字:节点 Xpath 选择 查询 相对 | 更新日期: 2023-09-27 18:03:11

我使用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查询行缺少什么,请给我一条出路

c#中具有相对顶级节点的Xpath选择查询

似乎您误解了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>");

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

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

将只打印匹配的<book>元素,但不包含周围的<bookstore>标记。