如何通过具有特定属性XML的多个元素选择/迭代?

时间:2017-03-15 19:54:10

标签: c# xml visual-studio linq

使用C# - Microsoft Visual Studio 2015 - 使用System.Xml.Linq

我正在尝试使用以下格式解析XML。代码的目标是查看所有消息,并查看哪些消息缺少给定ID的翻译,并将这些消息写入每个ID的新XML(从某种意义上说,填补了缺失的空白)。

以下示例:有4个ID(A,B,C,D)。消息1缺少D,消息2缺少B和C,消息3缺少A,C和D.因此,ID A的新XML文档将包括消息3.对于B,它将包括消息2。 C,它将包括消息2和3.对于D,它将包括消息1和2。

<M Code="Message 1" Translate="Y">
<ID="A"><![Translation A]></Lang>
<ID="B"><![Translation B]></ID>
<ID="C"><![Translation C]></ID>

</M>
<M Code="Message 2" Translate="Y">
<ID="A"><![Translation A]></ID>
<ID="D"><![Translation D]></ID>

</M>
 <M Code="Message 3" Translate="Y">
<ID="B"><![Translation B]></ID>
 </M>

我目前使用以下内容遍历包含所有4个ID(var id)的循环:

IEnumerable < XElement > forTrans = from el in UIWxml.Root.Elements("M")where (string)el.Attribute("Translate").Value == "Y" & (string)el.Elements().First().Attribute("ID").Value.ToUpper() != id

此代码成功执行了所需的任务,但它只对每条消息中的第一个ID起作用 - 它不会检查所有实例(在示例中,这只表示它只检查消息1和2中的ID A,并且消息3中的ID D)。我一直试图搞砸这条线,我相信问题在于: (字符串)el。 Elements()。First()。Attribute(“ID”) .Value.ToUpper()!= id

我正在寻找一个解决方案,允许我检查属性ID的所有元素!=其中一个硬编码ID(在示例中,我希望它能够查看M1中的所有3个ID,2个ID) M2等)。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

尝试使用

IEnumerable <XElement> forTrans = 
  FROM el in UIWxml.Root.Elements("M")
  WHERE (string)el.Attribute("Translate").Value == "Y" & 
        el.Elements().All(
          c=> c.Attribute("ID").Value.ToUpper() != id
        )