2013-03-08 66 views
0

我使用xpath查詢C#中的xml文件。Xpath選擇查詢也相對最高級別的節點在C#

這裏是我的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查詢行,請帶我出去..

回答

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

謝謝JLRishe ... – 2013-03-08 19:38:49

1

該表達式選擇<bookstore>元素,因此輸出將是整個<bookstore>(及其所有子元素book)。如果你想具體的書,你需要使用不同的XPath

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

這將只打印匹配的<book>元素,但周圍無<bookstore>標籤。

+0

但我想通過查詢包括要做到這一點' 'tag – 2013-03-08 13:37:43

+1

@ShantanuBanerjee在這種情況下,您不再只是從原始XML中選擇元素,而是基於舊XML構建一個_new_ XML文檔。您是否考慮過爲此使用XSLT? – 2013-03-08 13:40:03