C#使用XPathSelectElements()选择XML元素

C#使用XPathSelectElements()选择XML元素,c#,xml,xpath,C#,Xml,Xpath,我有这个XML,有多个“vdsk”类型的元素,我想要全部。为了简单起见,我这里只有1个 <?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:schema

我有这个XML,有多个“vdsk”类型的元素,我想要全部。为了简单起见,我这里只有1个

<?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;
List allels=ioxdoc.Elements().ToList();
List allelElements=allels[0]。Elements().ToList();
var vdisks=来自所有元素中的vdisk。
其中(a=>a.Name.ToString()包含(“vdsk”))
选择vdisk;
我试图让它与XPathSelectElements()一起工作,我已经根据我在这里找到的示例和示例尝试了这些,但是列表总是空的

       List<XElement> allels = ioxdoc.Root.XPathSelectElements("vdsk").ToList();
       allels = ioxdoc.XPathSelectElements("xml/root/vdsk").ToList();
        allels = ioxdoc.XPathSelectElements("/root/vdsk").ToList();
List allels=ioxdoc.Root.XPathSelectElements(“vdsk”).ToList();
allels=ioxdoc.XPathSelectElements(“xml/root/vdsk”).ToList();
allels=ioxdoc.XPathSelectElements(“/root/vdsk”).ToList();
为什么不这样做:

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

上面这一行正确地报告了2个
s.

您的代码是绝对正确和明显的,但MS决定对相关名称空间进行太多限制,这导致了代码更笨拙。例如,如果根元素具有默认名称空间:

<diskStatsColl xmlns="default, unnecessary namespace">
    <vdsk ...>

冗长难看的代码,但您无法避免它。

您的根元素是什么?有效的XML文档必须有且只有一个根元素。缺少DiskStatColl的结束标记?@cheedep,很抱歉,格式错误。DiskStatColl是根元素。这确实有效,但您能解释一下原因吗?我的猜测是,您不能在迭代时更改枚举,但是“ToList()”调用会创建一个单独的集合,可以安全地进行迭代。@Jayde:您是对的。您不能在迭代时修改枚举。顺便说一句:我很喜欢你的关于我的页面。。。“爱的编码”部分!;)
var xml = XDocument.Load("your file");
var ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("foo", "default, unnecessary namespace");
var coll = xml.XPathSelectElements("//foo:node", ns).ToList();
var otherColl = xml.XPathSelectElements("/foo:diskStatsColl/foo:node", ns).ToList();