2017-03-15 117 views
0

使用C# - Microsoft Visual Studio 2015 - 使用System.Xml.Linq如何使用特定属性XML选择/遍历多个元素?

我想通过下面的格式解析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内径),用一个循环迭代执行以下操作:

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,并且ID D在M中消息3)。我一直在试图解决这一问题,我认为问题在于: (字符串)el。 元素()。首先()。属性( “ID”) .Value.ToUpper()!= ID

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

回答

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 
     ) 
+0

仍然没有运气试图更改后尝试 - 它会出现在所有()方法返回一个布尔值 - 在它返回true或false。确切的错误是'不能将类型bool转换为字符串' - 我实际上早就搞混了All()。还有其他建议吗?谢谢! – thesyllabus

+0

已更新..删除将.All全部转换为字符串 –

+0

可能的语法是&is && –