我正在寻找一种使用LINQ查询CIM文件的方法,以加快我对数据的分析,并验证从包含电网元素的数据库中导出的数据。由于我是C#的新手,我猜想在控制台应用程序中加载CIM很容易,并且基于标记值过滤某些元素。然而,到目前为止,我发现的所有教程都是直截了当的,其中的元素被命名为“学生”、“购买”等等。
我的元素名为“cim:Load根defined”,其中"cim“是根节点中定义的实际地址。
这样,当我尝试选择所有名为“cim:Load早餐开关”的元素时,我会在运行时抛出一个异常,因为元素的名称不能包含冒号。
我想从CIM文件中选择的元素示例:
<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://[address从根节点]}LoadBreak“之类的信息。
我不知道是否有可能这样做,但我只是好奇,谁是有经验的开发人员是否需要做类似的事情。
发布于 2021-03-21 15:39:36
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: PoleMountedhttps://stackoverflow.com/questions/66731720
复制相似问题