2011-10-20 12 views
4

私はXDocumentからテキスト値を取得する方法、XDocumentからテキスト値を取得するには?

<cars> 
<name> 
<ford>model1</ford> 
    textvalue 
<renault>model2</renault> 
</name> 
</cars> 

をXDocument.For例を抱えていますか?要素の中でのテキストの値を特定するにはどうすればよいですか?

+0

@ハサン・カーン - もちろん可能です。混合コンテンツモデルと呼ばれています。上記のXMLは整形式です。 –

+0

@DevNull私は訂正しました。それは有効なxmlです。 http://www.w3schools.com/schema/schema_complex_mixed.asp –

答えて

9

テキスト値はXTEXTとしてXLinqによって解釈されます。ノードはタイプXTEXTであるか参照ノードタイプをチェックしている場合ので、あなたは簡単に確認できます。

// get all text nodes 
var textNodes = document.DescendantNodes() 
         .Where(x => x.NodeType == XmlNodeType.Text); 

をしかし、それはあなただけtextvalueという名前のビット寂しいようで、テキストのその部分を見つけたいと私を打ちます。この妥当だが珍しいことを認識する実際の方法はありません。親が「名前」と命名されたかどうかをチェックするか、またはtextNode自体が単独で、または見ないであれば:

// get 'lost' textnodes 
var lastTextNodes = document.DescendantNodes() 
          .Where(x => x.NodeType == XmlNodeType.Text) 
          .Where(x => x.Parent.Nodes().Count() > 1); 

編集ただ1件の余分のコメント、私は多くの人々は、このXMLが無効であることを主張していることがわかります。私はそれに同意しなければならない。そのきれいではありませんが、それは

doc.XPathSelectElement("cars/name").Nodes().OfType<XText>() 

これはあなたのXtext型のすべてを与える必要があり、私の知識(とバリデータ)

+1

+1は、XMLが無効であると他の人が同意していないためです。 –

+0

@DevNull奇妙に聞こえる、奇妙な音、標準に反対... – Polity

+0

あなたは正しいです...彼らは間違っています。 ;-) –

3

プロパティNodesを使用して、ドキュメントのルート要素の子ノードを反復処理できます。そこにから、テキストノードはXTextインスタンスによって表される、およびそれらのテキスト値は、それらのValueプロパティを介して利用可能である:

string textValue = yourDoc.Root.Nodes.OfType<XText>().First().Value; 
0

上記のあなたのXMLを表すXDocumentを含む変数「ドキュメント」を想定するとに従ってまだ有効ですあなたが探しているプレーンテキストを含むテキストノード。

関連する問題