2013-05-21 101 views
1

我有這個XML,有多個元素的類型'vdsk',我希望他們都。爲了簡潔,我在這裏只有1個。C#使用XPathSelectElements選擇XML元素()

<?xml version="1.0" encoding="utf-8" ?> 
<diskStatsColl 
xmlns="http://ibm.com/storage/management/performance/api/2005/08/vDiskStats" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://ibm.com/storage/management/performance/api/2005 /08/vDiskStats schema/SVCPerfStatsV.xsd" scope="node" id="node1" cluster="v7000nd01" node_id="0x0000000000000001" cluster_id="0x00000200a0421666" sizeUnits="512B" timeUnits="msec" contains="virtualDiskStats" timestamp="2013-04-30 07:04:13" timezone="GMT-6:00"> 
<vdsk idx="0" 
ctr="137111307" ctrs="3553815134" ctw="580314768" 
ctws="12467258075" ctp="107973069" ctps="6910276416" 
ctrh="91819453" ctrhs="2398189867" ctrhp="67411787"/> 

<vdsk idx="1" 
ctr="137111307" ctrs="3553815134" ctw="580314768" 
ctws="12467258075" ctp="107973069" ctps="6910276416" 
ctrh="91819453" ctrhs="2398189867" ctrhp="67411787"/> 
</diskStatsColl> 

我可以得到根元素的屬性。我似乎無法獲取根的任何子元素。
此代碼的工作,但凌亂和雜牌

List<XElement> allels = ioxdoc.Elements().ToList(); 
    List<XElement> allelselements = allels[0].Elements().ToList();     
    var vdisks = from vdisk in allelselements. 
    Where(a => a.Name.ToString().Contains("vdsk"))  
     select vdisk; 

我試圖把它與XPathSelectElements()的工作,這些基於實例和例子,我發現在這裏我都試過,但名單始終是空的

 List<XElement> allels = ioxdoc.Root.XPathSelectElements("vdsk").ToList(); 
     allels = ioxdoc.XPathSelectElements("xml/root/vdsk").ToList(); 
     allels = ioxdoc.XPathSelectElements("/root/vdsk").ToList(); 
+0

什麼是你的根元素?有效的XML文檔必須只有一個根元素。 – cheedep

+0

錯過了diskStatsColl的結束標記? – Nanda

+0

@cheedep,抱歉搞亂了格式。 diskStatsColl是根元素。 –

回答

1

你爲什麼不這樣做:

var allels = ioxdoc.Root.Descendants().ToList(); 

上面一行正確報告2 <vdsk>秒。

+0

謝謝,這工作。我會用它。 –

+0

這確實有用,但你能解釋爲什麼嗎?我的猜測是,迭代時不能更改枚舉,但「ToList()」調用會創建一個單獨的集合,該集合可以安全地進行迭代。 – JayDee

+0

@JayDee:你說得對。迭代時不能修改枚舉。 BTW:我喜歡你關於我的網頁......「愛情編碼」部分! ;) –