我有这个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;
我试图让它与XPathSelectElements()一起使用,我根据我在这里找到的示例和示例尝试了这些但是列表总是空的
List<XElement> allels = ioxdoc.Root.XPathSelectElements("vdsk").ToList();
allels = ioxdoc.XPathSelectElements("xml/root/vdsk").ToList();
allels = ioxdoc.XPathSelectElements("/root/vdsk").ToList();
答案 0 :(得分:1)
你为什么不这样做:
var allels = ioxdoc.Root.Descendants().ToList();
以上行正确报告了2 <vdsk>
s。
答案 1 :(得分:0)
您的代码是绝对正确和显而易见的,但是MS决定对相关的命名空间进行过于严格的限制,从而导致代码更加笨拙。假设您的根元素具有默认名称空间:
<diskStatsColl xmlns="default, unnecessary namespace">
<vdsk ...>
然后,您不能简单地选择“ vdsk”-在每次对XPathSelectElements
的每次调用中都必须包括名称空间管理器。最终代码将如下所示:
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();
详细,丑陋的代码,但您无法避免。