2013-05-21 3 views
1

У меня этот XML, существует несколько элементов типа «vdsk», я хочу их всех. У меня только 1 здесь для краткости.C# Выбор элементов XML с помощью XPathSelectElements()

<?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: Мне нравится твоя обо мне страница ... часть «кодирования любви»! ;) –