2012-01-08 9 views
1
<root> 
    <data name="ID1"></data> 
    <data name="ID2"></data> 
</root> 
XDocument xmlDoc = XDocument.Load(xmlFile); 

bool exists = (from elem in xmlDoc.Descendants("root") 
       where elem.Element("data").Attribute("name").Value == "ID1" 
       select elem).Any(); 

チェック。私は間違って何をしていますか?それはID1が既に存在していることを見ていない

+0

'XMLDoc'の型は何を?それは 'XDocument'か' XElement'ですか?それは実際のXMLですか?これは有効なXMLではありません( 'data'ノードは閉じられません)。 –

+0

これは単なるXMLスニペットです。 – Rod

答えて

4

あなたが示したことに基づいて、まずXMLスニペットが有効なXMLではないことを指摘しておきます。 dataノードは閉じられません。

これは有効なXMLドキュメントであると仮定すると、最終的にはそのタイプが変数XMLDocのタイプに依存します。

XDocumentの場合は、そのコードスニペットが有効で、existsの値はtrueになります。この文書には、という子孫が含まれており、そのビジネスについて考えることができます。

一方、XElementの場合、そのコードスニペットは失敗し、existsの値はfalseになります。 XMLDoc変数は既にroot要素を参照しており、明らかにrootという子孫はありません。

あなたは、しかし、より多くのこのような多分何かあなたのクエリを書き直す必要があります。

// please follow .NET naming conventions and use lowercase for local variables 
XDocument xmlDoc = XDocument.Load(xmlFile); 

// iterate over the `data` elements, not the `root` elements 
bool exists = (from data in xmlDoc.Element("root").Elements("data") 
       where (string)data.Attribute("name") == "ID1" 
       select data).Any(); 
// using the cast is a personal style choice 
// using `XAttribute.Value` is fine too in this case 
+0

あなたが働いたので。なぜ私の仕事はできないのですか? btw、洞察力ありがとう! – Rod

+1

あなたのコードを殺すのは、あなたが 'root'要素を反復し、' data'要素ではなく、私が書き直しを提案したということです。あなたのコードは最初の 'data'要素だけを調べ、残りは無視します。あなたのXMLは、なぜそれが失敗しているのかを説明する異なる順序を持つかもしれません。 –

関連する問題