2013-05-10 14 views
8

Ben basit bir şey baktığımı düşünüyorum, ancak yinelemeli bir XDocument düğümleri ayıklamakta zorlanıyor. Ben o gözlem çocuk sahibi olmayan bu sadece eserler gibi görünse deDüğümleri bir XDocument içinde yinelemeli bulma

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

kullanarak her üç gözlem düğümleri alabilir düşünce

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

:

Ben buna benzer XML var. Ben de denedim .Ancestors ve .DecentantNodes, ama istediğimi almadım.

Kolayca ihtiyaç duyduğum şeyi alan özyinelemeli bir yöntem yazabilirim, ancak var olan bir yöntemi kullanmak istiyorum, özellikle de XML ile birkaç projede çalışacağım için. Belli bir şey eksik miyim?

Gözlemi belirten herhangi bir düğümün, kodu ve değeri almam gerektiğini unutmayın, bu nedenle aşağıdaki örnekte üç gözlem düğümünü işlemem gerekecek. Gözlem düğümlerinin yuvalanması ve miktarı isteğe bağlıdır.

Yardımlarınız için teşekkür ederiz.

EK

Ben XML hakkında yeterli bilgi vererek olmayabilir diye düşündüğüm oluyor. Etiketlerin bir fark yaratacağını düşünmüyordum, ama sanırım onları tam olarak dahil etmeliyim. Aşağıda, ayrıştırmaya çalıştığım gerçek bir iletinin ilk birkaç satırı var. Mahremiyet için "..." ile bazı metinleri değiştirdim.

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

I() "kod" element.Element() Eğer 'Console.WriteLine yazarsanız, burada yanlış olduğunu yakalayamaz Maalesef; sizin foreachta' sen 3 kodu beklendiği gibi alır –

+0

Hayır. Bunu izliyorum ve hiçbir şey anlayamıyorum. ExamineObservation'ı (element) tamamen atlıyor. Xml bir ad alanı kullanıyor; Bu bir fark yaratacak mıydı? – Tim

+1

xeondev ile anlaşıldı, bu işe yaramalı. Foreach döngüsündeki 'content' düğümünüzü nasıl başlatıyorsunuz? – Gjeltema

cevap

8

Sadece VS2012 bu kodu koştu ve doğru gözlem düğümü ve içeriğini çıkışı, Console.WriteLine() 3 kez isabet:

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

Düzen - hesaba yeni ad bilgisini alarak ve kullanarak XDocument yerine 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

Teşekkür ederim. Üzgünüm, bu bilgiyi dahil etmedim. Ben giderken xml öğreniyorum ve bu isim alanlarıyla ilk koşuşturmamdı. Yardımı çok takdir ediyorum! – Tim

+0

Endişelenmenize gerek yok - bazen çok az bir şey olup olmayacağını bilmeden, bir soruyu soru sormaya zorlaştırmak zordur. – Gjeltema

İlgili konular