我使用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查询行中缺少任何内容,请引导我一个出路..
答案 0 :(得分:1)
该表达式选择<bookstore>
元素,因此输出将是整个<bookstore>
(包含其所有子book
元素)。如果您需要特定的书籍,则需要使用不同的XPath
strExpression = "/bookstore/book[price>35.00]";
只打印匹配的<book>
元素,但没有周围的<bookstore>
标记。
答案 1 :(得分: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 <= 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>");