我尝试从 xml 文件获取信息,到目前为止我对导航非常满意
doc.Element("foo1").Element("foo2").Value
但现在我遇到了麻烦,我认为这是因为命名空间。
我使用此代码片段从 xml doc
中过滤出特定部分:
XNamespace xmlns = "http://www.siemens.com/automation/Openness/SW/Interface/v4";
IEnumerable<XElement> de =
from el in doc.Descendants(xmlns + "Section")
where el.Attribute("Name").Value == "Input"
select el;
给定命名空间,生成的 XElement 如下:
<Section Name="Input" xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4">
<Member Name="STARTTASTER" Datatype="Bool" Remanence="NonRetain" Accessibility="Public">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="ExternalVisible" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="ExternalWritable" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="UserVisible" Informative="true" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="UserReadOnly" Informative="true" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="UserDeletable" Informative="true" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
</Section>
这正是我想要的,我可以将其保存在root
现在我用
var foo = root.Element(xmlns + "Section");
Console.WriteLine(foo);
我希望得到这个
<Member Name="STARTTASTER" Datatype="Bool" Remanence="NonRetain" Accessibility="Public">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="ExternalVisible" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="ExternalWritable" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="UserVisible" Informative="true" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="UserReadOnly" Informative="true" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="UserDeletable" Informative="true" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
但我什么也没得到。 现在我的第一个问题是为什么,第二个问题是我如何才能达到预期的结果。
如果有更好/更实用的方法,我也会很高兴。 我实际上想将值“STARTTASTER”存储到变量中。
最佳答案
请尝试以下解决方案。
我将您的 XML 保存为 e:\Temp\Aschenauer.xml 文件:
<Section Name="Input" xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4">
<Member Name="STARTTASTER" Datatype="Bool" Remanence="NonRetain" Accessibility="Public">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="ExternalVisible" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="ExternalWritable" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="UserVisible" Informative="true" SystemDefined="true">true</BooleanAttribute>
<BooleanAttribute Name="UserReadOnly" Informative="true" SystemDefined="true">false</BooleanAttribute>
<BooleanAttribute Name="UserDeletable" Informative="true" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
</Section>
c#
void Main()
{
const string filename = @"e:\Temp\Aschenauer.xml";
XDocument xdoc = XDocument.Load(filename);
XNamespace ns = xdoc.Root.GetDefaultNamespace();
var NameAttr = xdoc.Descendants(ns + "Member")
.Attributes("Name").FirstOrDefault().Value;
Console.WriteLine($"Name='{NameAttr}'");
}
输出
名称='STARTTASTER'
关于c# - 了解 linq 中使用的 xml 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70748637/