c# - Linq 2 XML - 如何读取具有相同名称的元素

时间:2011-03-07 07:50:58

标签: c# xml linq-to-xml

xml的结构是:

<Rules>
    <rule ID="1" Parameter="IsD">
      <body>
        <ID>2</ID>
        <Ratio>=</Ratio>
        <Value>no</Value>
        <Operation>AND</Operation>
        <ID>3</IF_ID>
        <Ratio>=</Ratio>
        <Value>yes</Value>
      </body>
      <value>no problems</value>
    </rule>
</Rules>

如何阅读元素并使用以下结构创建规则:

If (<ID><Ratio><Value><Operation><ID><Ratio><Value>)

ID是一个问题ID。就我而言:

If (2 == no && 3 == yes)

请帮助我。

1 个答案:

答案 0 :(得分:2)

您可以使用Elements类的XElement方法。例如(假设您循环遍历所有rule),您可以编写

foreach (var rule in document.Root.Descendants("rule")) {
  var body = rule.Element("body");
  for (var i=0; i<body.Elements("ID").Count) {
    var id = body.Elemets("ID").ElementAt(i);
    var ratio = body.Elements("Ratio").ElementAt(i);
    var value = body.Elements("Value").ElementAt(i);
    /// ...
  }
}

请注意,使用Elements访问ElementAt()枚举的元素可能效率不高,另一种方法是使用单独的foreach循环遍历不同的子元素并存储它们位于List(或更好,使用ToList扩展方法)。

关键是,Elements枚举以文档顺序返回子元素,即它们与输入文档中出现的顺序相同(这就是您需要的内容)。

更好的解决方案是(IMO)在输入文档中添加更多结构以反映逻辑,例如:

<Rules>
  <rule ID="1" Parameter="IsD">
    <body>
      <term >
        <ID>2</ID>
        <Ratio>=</Ratio>
        <Value>no</Value>
      </term>
      <term operation="and">
        <ID>3</IF_ID>
        <Ratio>=</Ratio>
        <Value>yes</Value>
      </term>
  </body>
  <value>no problems</value>
</rule>