2013-05-10 11 views
8

私は単純なものを見落としていますが、XDocumentからノードを再帰的に抽出するのは難しいです。私はそれが観測は子供を持っていない、この作品だけのように見えますがXDocumentでノードを再帰的に見つける

foreach (XElement element in Content.Descendants("observation")) 
    ExamineObservation(element); 

を使用して、3つのすべての観測ノードを得ることができると思っ

<?xml version="1.0" encoding="iso-8859-1"?> 
<content> 
    <operation></operation> 
    <entry> 
    <observation> 
     <templateId/> 
     <code></code> 
     <value></value> 
     <entryRelationship> 
     <observation> 
      <templateId/> 
      <code></code> 
      <value></value> 
     </observation> 
     </entryRelationship> 
     <entryRelationship> 
     <observation> 
      <templateId/> 
      <code></code> 
      <value></value> 
     </observation> 
     </entryRelationship> 
    </observation> 
    </entry> 
</content> 

は、私がこれに似たXMLを持っています。私も.Ancestorsと.DecentantNodesを試しましたが、私が望むものを得られませんでした。

私は必要なものを得るための再帰的なメソッドを簡単に書くことができますが、既存のメソッドを使用することになります。特に、いくつかのプロジェクトでXMLを扱うことになります。私は明白な何かを欠いていますか

観測と言うノードはすべてコードと値を取得する必要があるので、以下の例では3つの観測ノードを処理する必要があります。観察ノードのネスティングおよび量は任意である。

ありがとうございました。

補遺

私がXMLに関する十分な情報を与えることがないかもしれないことを私に起こります。タグが違いを生み出すとは思っていませんでしたが、場合によってはタグを含める必要があります。以下は、私が解析しようとしている実際のメッセージの最初の数行です。私はいくつかのテキストをプライバシーのために "..."に置き換えました。

<?xml version="1.0" encoding="iso-8859-1"?> 
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <operation>update</operation> 
    <entry xmlns="urn:hl7-org:v3"> 
    <observation classCode="OBS" moodCode="EVN"> 
     <templateId root="..." /> 
     <code code="..." codeSystem="..." codeSystemName="..." displayName="..."> 
     </code> 
     <value xsi:type="..." code="..." codeSystem="..." codeSystemName="..." displayName="..."> 
     </value> 
     <entryRelationship typeCode="..."> 
     <observation classCode="..." moodCode="..."> 
+1

私はあなたが 'Console.WriteLineを(element.Element( "コード"))書く場合は、ここで間違っているものをキャッチすることはできません;'あなたのforeachであなたを期待通りに3つのコードを取得します –

+0

いいえ私はこれをトレースし、何も戻ってきません。 ExamineObservation(要素)を完全にスキップします。 xmlは名前空間を使用しています。それは違いをもたらすだろうか? – Tim

+1

xeondevと合意しました。これはうまくいくはずです。 foreachループで 'Content'ノードをどのように初期化していますか? – Gjeltema

答えて

8

私はVS2012でこのコードを実行し、それが正しく観測ノードと内容を出力、Console.WriteLine() 3回をヒット:

 XElement content = XElement.Parse(yourXmlStringWithNamespaceHeader); 
     foreach (XElement obs in content.Descendants("observation")) 
      Console.WriteLine(obs.ToString()); 

編集 - アカウントに新しい名前空間の情報を取って、および使用しますXDocument代わりのXElement

申し訳
 XNamespace nse = "urn:hl7-org:v3"; 
     XDocument content = XDocument.Parse(yourXmlStringWithNamespaceHeader); 
     foreach (XElement ele in content.Descendants(nse + "observation")) 
      Console.WriteLine(ele.ToString()); 
+0

ありがとうございます。申し訳ありませんが、私はその情報を最初から含めませんでした。私が行くにつれてXMLを学んでいますが、これは名前空間を使った初めての実行でした。私は大いに助けに感謝します! – Tim

+0

心配はありません。質問が少なすぎるかどうかを知らずに、何かを質問に変えることは難しい場合もあります。 – Gjeltema

関連する問題