簡體   English   中英

用 LINQ 查詢 C# 中的 CIM XML

[英]Querying CIM XML in C# with LINQ

我正在尋找一種方法來使用 LINQ 查詢 CIM XML 文件,以加快我對數據的分析並驗證來自包含電網元素的數據庫的導出。 由於我是 C# 的新手,我猜想在控制台應用程序中加載 CIM XML 並基於標簽值過濾一些元素會很容易。 然而,到目前為止我發現的所有教程都是直截了當的,其中元素被命名為“學生”、“購買”等。

我的元素被命名為“cim:LoadBreakSwitch”,其中“cim”是根節點中定義的實際地址。

這樣,當我嘗試 select 所有名為“cim:LoadBreakSwitch”的元素時,我會在運行時拋出異常,因為元素的名稱不能包含冒號。

我想從 CIM XML 文件中獲取 select 的元素示例:

<cim:LoadBreak rdf:ID="101">
    <cim:ConductingEquipment.phases>A</cim:ConductingEquipment.phases>
    <cim:IdentifiedObject.description>PoleMounted</cim:IdentifiedObject.description>
 </cim:LoadBreak>

當我在控制台中打印所有元素的名稱時

IEnumerable<XElement> elements = xmlDoc.Elements();

        foreach (var item in elements)
        {
            Console.WriteLine(item.Name);
        }

我得到類似“{http://[根節點的地址]}LoadBreak”的東西。

我不知道是否有可能這樣做,但我只是好奇是否有經驗豐富的開發人員需要做類似的事情。

您的 XML 缺少帶有命名空間聲明的根元素。

這是一個概念性的例子。 它展示了如何處理命名空間並使用它們查詢 XML。

c#

void Main()
{
    XDocument xdoc = XDocument.Parse(@"<rdf:RDF xmlns:cim='http://iec.ch/TC57/2008/CIM-schema-cim13#'
                 xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
            <cim:LoadBreak rdf:ID='101'>
                <cim:ConductingEquipment.phases>A</cim:ConductingEquipment.phases>
                <cim:IdentifiedObject.description>PoleMounted</cim:IdentifiedObject.description>
            </cim:LoadBreak>
        </rdf:RDF>");

    XNamespace cim = xdoc.Root.GetNamespaceOfPrefix("cim");
    XNamespace rdf = xdoc.Root.GetNamespaceOfPrefix("rdf");

    foreach (XElement xelem in xdoc.Descendants(cim + "LoadBreak").Elements())
    {
        Console.WriteLine("{0}: {1}"
            , xelem.Name.LocalName
            , xelem.Value);
    } 
}

Output

ConductingEquipment.phases: A
IdentifiedObject.description: PoleMounted

暫無
暫無

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

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