2011-05-18 146 views
1

鑑於例如下面的XML文檔:選擇子節點,但使用XPath忽略非元素?

<?xml version="1.0"?> 
<UrdaObject> 
    <Date> 
    <Year>2011</Year> 
    <Month>5</Month> 
    <Day>18</Day> 
    <Hours>8</Hours> 
    <Minutes>47</Minutes> 
    <Seconds>36</Seconds> 
    </Date> 
    <random_value>24</random_value> 
</UrdaObject> 

而且理解child::node() - Selects all child nodes of the current node我將如何創建一個XPath(從根開始),將選擇除文本,註釋所有子節點,和其他東西不是要素。例如,使用此代碼來創建WPF樹視圖時:

// x is some XmlDocument, xmlTree is my WPF TreeView 
XmlDataProvider provider = new XmlDataProvider(); 
provider.Document = x; 
Binding binding = new Binding(); 
binding.Source = provider; 
binding.XPath = "child::node()"; 
xmlTree.SetBinding(TreeView.ItemsSourceProperty, binding); 

我將如何去創造我的XPath語句,所以我建立與節點會一路下滑和原始文本之前停止一個TreeView?例如,它會產生一個觀點:

UrdaObject 
    Date 
    Year 
... 

而不是...

UrdaObject 
    Date 
    Year 
     2011 (Don't want this!) 
... 

示例XML文件只是爲我解釋一下我的情況。該表達式應該能夠導航任意有效的XML文件並且拉取元素,但不能拉取單個文本。


我們怎麼解決這個問題?我已將child::node()的所有參考切換爲child::*。但是,我沒有更正我的XAML中的一條線,它正在拉動child::node()。糾正這一行使應用程序行爲正確......並讓我感到無聊。

回答

2

child::node()發現所有子節點。 child::*找到全部元素節點。

+0

我曾經嘗試過,但子:::也調出了C#TreeView中的單個文本條目(給出了上面的代碼塊),但綁定保持訪問文本視圖,就好像它是一個元素,我可以看起來解釋它。 – Urda 2011-05-18 17:26:36

+0

...我從上面收回我的評論。這固定了它,原因如下:我已經正確地構建了查詢,但在我的XAML中的一個模板中,一個愚蠢的錯誤仍然試圖使用'node()'屬性拉出所有元素。糾正此問題導致樹視圖正常工作。哇,我覺得愚蠢的想念... – Urda 2011-05-18 17:40:11

0

不知道這是你想要的,但可以這樣做嗎?

var doc =XDocument.Parse(@" 

<UrdaObject> 
    <Date> 
    <Year>2011</Year> 
    <Month>5</Month> 
    <Day>18</Day> 
    <Hours>8</Hours> 
    <Minutes>47</Minutes> 
    <Seconds>36</Seconds> 
    </Date> 
    <random_value>24</random_value> 
</UrdaObject> 
"); 



     var query = from s in doc.Descendants() 
        select s.Name; 


     foreach (var name in query) 
     { 
      Console.WriteLine(name); 
     } 
+0

1)我不在這個項目中使用XDocument,2)我有點受限於使用XPath來獲得我需要的結果,或者一些以前的TreeView的XML操作。 – Urda 2011-05-18 17:19:13

2

它就像*一樣簡單。

(即立即得到孩子,但是,如果你希望所有後代元素,這將是descendant::*

1

child::*將排除文本節點,只留下元素節點

child::text()將只包含文本節點

child::node()將包括元素和文本節點

http://www.w3.org/TR/xpath/#location-paths

+0

有沒有一種方法可以明確排除文本節點?我認爲問題是TreeView遍歷XML文件,並且仍然拉出單個文本節點並添加它們,即使使用'child :: *' – Urda 2011-05-18 17:31:15

+0

我是一個傻瓜,上面的解釋。然而,自從他有一個較早的時間戳以來,我不得不給出答案。 – Urda 2011-05-18 17:42:41

+0

我認爲你會混淆XPath選擇和TreeView如何顯示它。 – 2011-05-18 21:32:35