Suche nach Knoten Rekursiv in ein XDocument

Ich denke, ich bin etwas Blick einfach, aber ich habe Schwierigkeiten beim extrahieren von Knoten aus einer XDocument-rekursiv.

Habe ich XML-ähnlich wie diese:

<?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>

Dachte ich, ich könnte alle drei Beobachtung Knoten mit

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

Obwohl es sieht aus wie diese funktioniert nur, wenn die Beobachtung keine Kinder haben. Ich habe auch versucht .Vorfahren und .DecentantNodes, aber nicht bekommen, was ich wollte.

Kann ich problemlos schreiben Sie eine rekursive Methode, die bekommt von mir, was ich brauche, aber ich würde eher von einer bestehenden Methode, wenn es einer ist, vor allem, da ich die Arbeit mit XML-durchaus ein bit auf mehrere Projekte. Übersehe ich etwas offensichtliches?

Beachten Sie, dass jeder Knoten, der sagt, die Beobachtung, die ich brauche um den code zu erhalten und Wert aus, also im Beispiel unten, die ich verarbeiten muss, Beobachtung drei Knoten. Die Verschachtelung und die Menge der Beobachtung Knoten sind frei wählbar.

Danke für jede Hilfe.

NACHTRAG

Fällt mir ein, dass ich möglicherweise nicht genug Informationen über die XML. Ich glaube nicht, tags würde einen Unterschied machen, aber ich glaube, ich sollte beinhalten, nur für den Fall. Unten ist die ersten paar Zeilen der eigentlichen Nachricht, die ich bin versucht zu analysieren. Ich habe ersetzt einen text mit "..." für die Privatsphäre.

<?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="...">
  • Leider kann ich nicht fangen, was ist hier falsch, wenn Sie schreiben Console.WriteLine(element.Element("code")); in deiner foreach-Sie erhalten drei Codes wie erwartet
  • Nein. Ich trace durch, und ich bekomme nichts zurück. Es komplett überspringt ExamineObservation(element). Der xml-Namensraum; würde das einen Unterschied machen?
  • Vereinbart mit xeondev, dies sollte funktionieren. Wie sind Sie mit der Initialisierung Ihrer Content Knoten in der foreach-Schleife?
  • XDocument Content = XDocument.Parse(message); // Wo die Nachricht ist ein xml-string
  • Bearbeitet meine Antwort mit Informationen über Ihre aktualisierten xml mit namespace - das ist irgendwie wichtig zu wissen. 🙂
  • Ja, xml-namespace ist nicht egal, siehe Gjeltema Antwort. Und vergessen Sie nicht, zu verwenden-namespace in ExamineObservation Methode auch. wie Console.WriteLine((string)element.Element(nse + "code"));
  • Danke Gjeltema und xeondev. Ich stieß jeden Ihrer Kommentare, weil meine Unterlassung kniff meine Frage. Danke Euch beiden für Eure Hilfe.

InformationsquelleAutor Tim | 2013-05-10
Schreibe einen Kommentar