2013-05-10 34 views
8

Tôi hình tôi đang nhìn một cái gì đó đơn giản, nhưng tôi đang gặp khó khăn khi trích xuất các nút từ một XDocument đệ quy.Tìm các nút đệ quy trong một XDocument

Tôi có XML tương tự như sau:

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

tôi nghĩ rằng tôi có thể nhận được tất cả các nút ba quan sát sử dụng

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

Mặc dù nó trông giống như tác phẩm chỉ này khi quan sát không có con. Tôi cũng đã thử .Ancestors và .DecentantNodes, nhưng không nhận được những gì tôi muốn.

Tôi có thể dễ dàng viết một phương pháp đệ quy giúp tôi những gì tôi cần, nhưng tôi muốn sử dụng một phương pháp hiện có nếu có, đặc biệt vì tôi sẽ làm việc với XML khá nhiều trong một số dự án. Tôi có thiếu một cái gì đó hiển nhiên?

Lưu ý rằng bất kỳ nút nào nói rằng quan sát, tôi sẽ cần lấy mã và giá trị từ, vì vậy trong ví dụ bên dưới, tôi sẽ cần xử lý ba nút quan sát. Tổ và số lượng các nút quan sát là tùy ý.

Cảm ơn bạn đã hỗ trợ.

PHỤ LỤC

Nó xảy ra với tôi rằng tôi có thể không được đưa ra đầy đủ thông tin về XML. Tôi không nghĩ rằng thẻ sẽ tạo ra sự khác biệt, nhưng tôi cho rằng tôi nên đưa chúng vào trường hợp. Dưới đây là một số dòng đầu tiên của một thông điệp thực tế mà tôi đang cố gắng phân tích cú pháp. Tôi đã thay thế một số văn bản bằng "..." để bảo mật.

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

Xin lỗi tôi không thể bắt những gì là sai ở đây, nếu bạn viết 'Console.WriteLine (element.Element ("code")); 'trong foreach của bạn, bạn sẽ nhận được ba mã như mong đợi –

+0

No. Tôi theo dõi điều này, và tôi không nhận được gì. Nó hoàn toàn bỏ qua quá khứ ExamineObservation (phần tử). Xml đang sử dụng một không gian tên; điều đó có tạo nên sự khác biệt không? – Tim

+1

Đồng ý với xeondev, điều này sẽ hoạt động. Bạn đang khởi tạo nút 'Content' của bạn trong vòng lặp foreach như thế nào? – Gjeltema

Trả lời

8

Tôi chỉ cần chạy mã này trong VS2012, và nó nhấn Console.WriteLine() 3 lần, xuất ra các nút quan sát và nội dung một cách chính xác:

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

Edit - có tính đến các thông tin không gian tên mới, và sử dụng XDocument thay vì 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

Cảm ơn bạn. Tôi xin lỗi tôi đã không bao gồm thông tin đó để bắt đầu. Tôi đang học xml khi tôi đi, và đây là lần đầu tiên tôi chạy với không gian tên. Tôi đánh giá cao sự giúp đỡ! – Tim

+0

Không phải lo lắng - đôi khi rất khó để cắt giảm một cái gì đó thành một câu hỏi có thể hỏi, mà không biết nếu nó sẽ là quá ít. – Gjeltema

Các vấn đề liên quan