【问题标题】:How to write a single LINQ to XML query to iterate through all the child elements & all the attributes of the child elements?如何编写单个 LINQ to XML 查询来遍历所有子元素和子元素的所有属性?
【发布时间】:2011-03-29 19:05:00
【问题描述】:

我正在开发 asp.net 移动应用程序。我使用 XML 作为数据库。我正在查询 XML 以通过在 .net 中使用 LINQ to XML 访问所需的元素和属性。我的 XML 文件中有以下部分。

<VALVES>
     <VALVE NAME="PWV">
      <DISPLAY-NAME>
       Production Master Valve
      </DISPLAY-NAME>
      <COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
    </VALVE>
    <VALVE NAME="PMV" >
     <DISPLAY-NAME>
      Production Wing Valve
     </DISPLAY-NAME>
     <COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
    </VALVE>
</VALVES>

在上面的 XML 文件中,我可以使用以下代码动态访问子元素节点“VALVE”及其属性“NAME”,而无需显式指定属性的名称。 因此,在子节点“VALVE”中添加了任何新属性时,我可以在不修改现有代码的情况下访问它。对于这样的逻辑,我使用以下代码。在下面的代码中,ValvesProperties 是在“Valve”类中定义的 Hashtable。

 static int count = 0;
 List<Valves> LstValves = new List<Valves>();

 string AttName = null;
 string AttValue = null;

 XDocument FieldDef = XDocument.Load(@"F:\Shailesh from user OPC\XML\KK3.xml");
 XElement FieldRoot = FieldDef.Element("KK");

 count = FieldRoot.Element("FIELD-DEFINITION").Element("VALVES").Elements("VALVE").Count();
 Valves[] Valveobj = new Valves[count];

 count = 0;

 foreach (var element in FieldRoot.Element("FIELD-DEFINITION").Element("VALVES").Elements())
 {
     Valveobj[count] = new Valves();

     foreach (var attribute in element.Attributes())
     {
         AttName = attribute.Name.ToString();
         AttValue = attribute.Value.ToString();
         Valveobj[count].ValvesProperties.Add(AttName, AttValue);
         LstValves.Add(Valveobj[count]);
     }

     count++;
  }

return LstValves;

上面定义的 XML 部分需要类似的逻辑。在上面的 XML 中,我想编写 LINQ to XML 查询,它可以访问 'VALVE' 节点 (&lt;VALVE NAME="PWV"&gt;) 的 NAME 属性,然后它应该访问 'DISPLAY-NODE' (&lt;DISPLAY-NAME&gt; Production Master Valve &lt;/DISPLAY-NAME&gt;) 之间的文本,&那么它应该动态访问“COMMAND”节点的所有属性(&lt;COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"&gt;&lt;/COMMANDS&gt;)。所有这些我想要动态而不显式指定子节点的名称以及它们的属性名称(类似于我编写上述查询的方式) 我们可以使用 LINQ to XML 编写这样的代码吗?如果我们可以用单一逻辑为上述问题编写代码会更好(类似于我编写上述查询的方式)。你能提供我可以解决上述问题的任何代码或链接吗?

【问题讨论】:

  • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!

标签: c# asp.net xml linq-to-xml


【解决方案1】:

您可以遍历所有元素并检索每个元素的属性:

var allDescendants = myElement.DescendantsAndSelf();
var allDescendantsWithAttributes = allDescendants.SelectMany(elem =>
    new[] { elem }.Concat(elem.Attributes().Cast<XContainer>()));

foreach (XContainer elementOrAttribute in allDescendantsWithAttributes)
{
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多