2016-10-21 3 views
0

Только что получил новую проблему xml, с которой я немного застрял. Может быть, кто-нибудь может толкать меня в правильном направлении :)Найти определенный родительский узел из любого возможного дочернего узла

У меня есть XML, глядя, как это:

<import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///XXXXXXXXX/TraumaSchema.xsd"> 
    <creationDate>2016-10-18</creationDate> 
    <hospitalCode>XXXXXXXXXXXX</hospitalCode> 
    <importCasesWithErrors>0</importCasesWithErrors> 
    <caseState>1</caseState> 
    <caseList> 
     <case> 
      <patientCode>XXXXXXXXXXX</patientCode> 
      <internalPatientId>XXXXXXXXXXXXXXX</internalPatientId> 
      <masterData> 
       <patient> 
        <age/> 
        <sex>1</sex> 
        <asa>1</asa> 
       </patient> 
       <accident> 
        <cause>1</cause> 
        <trauma>1</trauma> 
        <dateTime> 
         <date>2016-05-15</date> 
         <time>01:30:00</time> 
        </dateTime> 
       </accident> 
      </masterData> 
      <preClinicalData> 
       <alarm> 
        <date>2016-05-15</date> 
        <time>02:00:00</time> 
       </alarm> 
       <arrival> 
        <date>2016-05-15</date> 
        <time>01:30:00</time> 
       </arrival> 
       <departure> 
        <date>2016-05-15</date> 
        <time/> 
       </departure> 
       <vitalSign> 
        <capnometry>0</capnometry> 
        <systolicBloodPressure> 
         <mmHg>140</mmHg> 
        </systolicBloodPressure> 
        <heartRate> 
         <perMinute>130</perMinute> 
        </heartRate> 
        <respiratoryRate> 
         <perMinute>20</perMinute> 
        </respiratoryRate> 
        <oxygenSaturation> 
         <percent>97</percent> 
        </oxygenSaturation> 
       </vitalSign> 
      .... 
      .... 
      .... 
     </case> 
     <case> 
      .... 
      .... 
      .... 

XML-довольно большие и две вещи важно знать. Существует элемент «caseList», который содержит переменное число случаев -> «case». Каждый «корпус» состоит из многих других элементов. Элемент в фокусе «patientCode», который содержится в любой группе случаев.

Что нужно, так это получить этот родительский элемент «patientCode», начиная с любого возможного дочернего узла.

Я не знаю, откуда в иерархии я должен начать. Единственное, что я знаю, это то, что мне нужно получить этого конкретного родителя.

Есть ли у кого-нибудь идеи, как достичь этого?

Любая помощь очень ценится.

вид касается Сандро

+0

Загрузите xml в XDocument. Затем просмотрите принятый ответ здесь http://stackoverflow.com/questions/451950/get-the-xpath-to-an-xelement. Затем, после того как вы получите путь к текущему элементу, выполните поиск родителя и получите только нужную вам часть. – Lidaranis

+0

заметил, что определенный текст не был записан в моем тексте запроса -> исправлено Спасибо, Лидаранис, но это не работает для меня. Я получаю огромный список путей, но все же у меня проблема, что я не знаю, где будет начальный пионт. пожалуйста, еще раз взгляните на мой вопрос –

+0

Дайте мне знать, если я это понимаю. Вы хотите, чтобы searchCode был основан на одном из дочерних элементов элемента case. Например, получите код pacient, где oxygenSaturation/percent == 97, но узел, на котором вы основываете свой поиск (здесь oxygenSaturation/percent), является динамическим. Я на правильном пути? – Lidaranis

ответ

0

Пробный код, как это. Это не должно быть необходимо, чтобы получить родителя, если код структурирован правильно

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication21 
{ 
    class Program 
    { 
     const string FILEName = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILEName); 

      XElement caseList = doc.Descendants().Where(x => x.Name.LocalName == "caseList").FirstOrDefault(); 
      XNamespace ns = caseList.GetDefaultNamespace(); 

      var results = caseList.Descendants(ns + "case").Select(x => new { 
       masterData = x.Descendants(ns + "masterData").Select(y => new { 
        age = y.Descendants(ns + "age").Select(z => z.IsEmpty ? null : (int?)z).FirstOrDefault(), 
        sex = (int?)y.Descendants(ns + "sex").FirstOrDefault(), 
        asa = (int?)y.Descendants(ns + "asa").FirstOrDefault(), 
        cause = (int?)y.Descendants(ns + "cause").FirstOrDefault(), 
        trauma = (int?)y.Descendants(ns + "trauma").FirstOrDefault(), 
        date = (DateTime) y.Descendants(ns + "date").FirstOrDefault() + ((DateTime)(y.Descendants(ns + "time").FirstOrDefault())).TimeOfDay, 
       }).FirstOrDefault(), 
       preClinicalData = x.Descendants(ns + "masterData").Select(y => new { 
        alarm = (DateTime) y.Descendants(ns + "date").FirstOrDefault() + ((DateTime)(y.Descendants(ns + "time").FirstOrDefault())).TimeOfDay, 
        arrival = (DateTime)y.Descendants(ns + "date").FirstOrDefault() + ((DateTime)(y.Descendants(ns + "time").FirstOrDefault())).TimeOfDay, 
        departure = (DateTime)y.Descendants(ns + "date").FirstOrDefault() + ((DateTime)(y.Descendants(ns + "time").FirstOrDefault())).TimeOfDay, 
        capnometry = (int?)x.Descendants(ns + "capnometry").FirstOrDefault(), 
        mmHg = (int?)x.Descendants(ns + "mmHg").FirstOrDefault(), 
        heartRate = (int?)x.Descendants(ns + "heartRate").FirstOrDefault(), 
        respiratoryRate = (int?)x.Descendants(ns + "respiratoryRate").FirstOrDefault(), 
        oxygenSaturation = (int?)x.Descendants(ns + "oxygenSaturation").FirstOrDefault(),      
       }).FirstOrDefault() 
      }).ToList(); 


     } 
    } 

} 
+0

Большое спасибо jdweng, но, к сожалению, я не могу использовать этот вид реализации. XML создается путем сериализации сложной структуры классов. В зависимости от данных некоторые XML-элементы не будут сериализованы и т. Д. Таким образом, контент и структура не всегда одинаковы. –

0

UPDATE

Хорошо, у меня была другая идея:

Я знаю, какой узел выбран. С этим я могу получить путь к корню, как это

var element = doc.Descendants(GetSelectedNode()).First(); 
var names = element.AncestorsAndSelf() 
      .Reverse() 
      .Skip(1) // Skip the root 
      .Select(x => x.Name); 
var joined = string.Join("/", names); 

присоединился теперь содержит путь к корню, как это, например:

caseList/case/preClinicalData/therapy/catecholamines (-> a selected node) 

Сейчас проблема заключается в том, что мне нужно следить за путь для получения элемента «patientCode» прямо под «case» -node.

Как я могу следовать найденному пути, чтобы получить соответствующие данные элемента с помощью xPath, например?

Смежные вопросы