c# - 了解 linq 中使用的 xml 命名空间

标签 c# xml linq attributes namespaces

我尝试从 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/

相关文章:

java - 如何使用 Java 获取 XML 节点值?

java - 将数字四舍五入到小数点后第一位

c# - DataTable 上的 LINQ 查询 - 找不到查询模式的实现

c# - 如何等待用户进程的系统进程?

c# - 什么是IBuffer?

sql-server - SQL Server中如何将XML数据转换成行列数据

c# - LINQ 选择一列中具有 Max 且另一列中具有 Distinct 的行

c# - Linq to XML - 根据 if 语句设置 Xelement 值

c# - 与 ASP.NET Identity UserManager 的事务

c# - 使用 C# 以编程方式登录亚马逊