2016-04-19 6 views
0

私のコードでは、xelementを繰り返し処理し、その要素内の各ノードの値を返します。両方<Directory>要素が文字列で返されXelementは要素値を2回追加します

foreach(XElement n in XDocument.Descedants("element_name) 
{ 
    Console.WriteLine("Searching: " n.Value); 
} 

私の問題がされて

Searching: C:\Users\215358\OneDrive\MusicC:\Users\215358\Dropbox\Music 

私のXMLファイルには、次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<Directories> 
    <Directory>C:\Users\215358\OneDrive\Music</Directory> 
    <Directory>C:\Users\215358\Dropbox\Music</Directory> 
</Directories> 

は、私は、出力二行目の要素でそれを期待します<Directory>はこのようになります:

C:\Users\215358\Dropbox\Music 

なぜこれが起こっていますか?

+1

「xml」はどのように見えますか?期待されるアウトプットについても説明する。 –

+0

検索条件は何ですか?あなたは最後の要素を取りたいだけですか? –

+0

すべての要素を一度に1つずつ検索したい –

答えて

2

XElement.Valueはconcatenated text contents of an elementを取得します。これには子要素のテキストが含まれていますが、これは必ずしも有用ではありません。現在の要素からのテキストだけが必要な場合は、その子ノードでテキストノードを見つけることができます。

foreach(XElement n in XDocument.Descedants("Directory")) 
{ 
    var text = n.Nodes().Where (x => x is XText).Cast<XText>().FirstOrDefault(); 
    if(text!=null){ 
     Console.WriteLine("Searching: " + text.Value); 
    }else{ 
     Console.WriteLine("No text node found"); 
    } 
} 
+0

これは動作しますが、ファイル内の最初のディレクトリのみが出力されます。私はそれが私にすべてのディレクトリを次々に与えることを望む。 EDIT:それは間違っている。できます!ありがとうございました –

0

各エントリと検索要素の値を繰り返し処理したいので、このようなことができます。場合

foreach (var element in doc.Descendants("Directory")) 
{ 
    if((string)element.Value == "searchstring") 
    { 
      // your logic 
    } 
} 

あなたはxmlの2番目の要素を探しているなら、あなたは要素の指定された数をスキップするSkip拡張を適用することができます。

var secondelement = doc.Descendants("Directory").Skip(1); // Skip first element; 

またはあなたが最後の要素を探しているなら、あなたはLastLastOrDefault拡張子を取ることができます。

var lastelement = doc.Descendants("Directory").LastOrDefault(); 

チェックこのexampleを確認してください。

関連する問題