簡體   English   中英

C# 使用 XPathSelectElements() 選擇 XML 元素

[英]C# Selecting XML Elements With XPathSelectElements()

我有這個 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();

你為什么不這樣做:

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

上面的行正確報告了 2 <vdsk> s。

您的代碼絕對正確且顯而易見,但 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();

冗長、丑陋的代碼,但你無法避免。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM