【问题标题】:Querying CIM XML in C# with LINQ使用 LINQ 在 C# 中查询 CIM XML
【发布时间】:2021-06-18 06:03:00
【问题描述】:

我正在寻找一种使用 LINQ 查询 CIM XML 文件的方法,以加快我的数据分析速度并验证来自包含电网元素的数据库的导出。 由于我是 C# 的新手,我猜想在控制台应用程序中加载 CIM XML 并基于标签值过滤一些元素会很容易。但是,到目前为止,我发现的所有教程都是直截了当的,其中元素被命名为“学生”、“购买”等。

我的元素命名为“cim:LoadBreakSwitch”,其中“cim”是根节点中定义的实际地址。

这样,当我尝试选择所有名为“cim:LoadBreakSwitch”的元素时,我会在运行时抛出异常,因为元素的名称不能包含冒号。

我想从 CIM XML 文件中选择的元素示例:

<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"。

我不知道是否有可能这样做,但我只是好奇是否有经验丰富的开发人员需要做类似的事情。

【问题讨论】:

  • cimrdf 是命名空间前缀。 Here is an example of working with namespaces
  • 使用 XElement : doc.Descendants().Where(x => x.Name.LocalName == "LoadBreak").ToList();
  • @jdweng xml 可能出于某种原因使用命名空间。如果在不同的命名空间中使用元素名称,这将返回不需要的结果。
  • 谢谢@Crowcoder。我会看看你提供的文章。老实说,我不知道命名空间,甚至不知道这个术语。你打开了新的主题让我调查。
  • @Crowcoder :这种情况很少发生在 XML 中。

标签: c# .net xml linq cim


【解决方案1】:

您的 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);
    } 
}

输出

ConductingEquipment.phases: A
IdentifiedObject.description: PoleMounted

【讨论】:

  • 感谢您的示例和澄清。很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多