2012-06-22 58 views
1

我有以下XML。列表框裏面XPath - 返回子節點但不是子孫

<Programme> 
    <Intakes> 
     <One> 
      <Information /> 
     </One> 
     <Two> 
      <Information /> 
     </Two> 
    </Intakes> 
</Programme> 

通緝的結果信息:

One 
Two 

基本上我想填充列表框與各進(一,二,等)的選項。

沒有多個發生。

所以我沒有得到個人攝入子節點?

當前代碼:

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

     docNav = new XPathDocument(docPath); 
     nav = docNav.CreateNavigator(); 

     strExpression = "//Intakes/node()"; 
     NodeIter = nav.Select(strExpression); 

     while (NodeIter.MoveNext()) 
     { 
      lstIntakes.Items.Add(NodeIter.Current.Value); 
     } 

然而,這只是增加了一個項目,以包含來自所述節點內的所有XML列表框。

+2

這不是很清楚,如果你有多個'Intakes'節點,你想合併它們嗎?或者你想消除'信息'節點 – nunespascal

+0

是的,請澄清。並更新預期結果。謝謝! –

+0

請解釋你爲什麼要這麼做。 XPath用於選擇節點集。例如,當您選擇'// Intakes/*'時,您將返回''和''節點以供進一步處理。你可以忽略更多的孩子。如果你想*刪除更多的孩子並將其保存到一個文件中,那麼你就超越了純XPath的能力。 –

回答

4

XPath是XML文檔的查詢語言,因此它不能更改文檔的結構。

XSLT是將XML文檔轉換爲另一個的合適工具。這個問題的XSLT解決方案是:

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

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

<xsl:template match="/*"><xsl:apply-templates/></xsl:template> 
<xsl:template match="One/node()|Two/node()"/> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<Programme> 
    <Intakes> 
     <One> 
      <Information /> 
     </One> 
     <Two> 
      <Information /> 
     </Two> 
    </Intakes> 
</Programme> 

有用,正確的結果產生:

<Intakes> 
    <One/> 
    <Two/> 
</Intakes> 

UPDATE:OP已更改根本的問題 - 現在想要的結果是:

One 
Two 

這仍然不能由單一的XPath 1.0表達式來提供(和你使用的是C#,你可能無法訪問的XPath 2.0實現) 。

你必須先選擇Intakes所有子元素:

/*/Intakes/* 

然後,你必須通過遍歷返回的節點集,並且對其中包含的每個元素評估該XPath表達式

name() 
+0

在回答Dimitre時澄清了我的問題,它是在急於寫入,我意識到現在它給了我想要的完全錯誤的印象 – Mike

+0

@Mike:沒問題 - 我已更新答案 - 這是否顯示如何解決問題? –

+0

確實如此,謝謝! – Mike

相關問題