2017-03-15 116 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 && –