[英]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.