从任何可能的子节点中找到特定的父节点

本文关键字:父节点 任何可 子节点 | 更新日期: 2023-09-27 18:14:05

刚刚遇到一个新的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 ->"case"。每个"case"由许多其他元素组成。关注的元素是"patientCode",它可以包含在任何case-group中。

我需要实现的是让这个父元素"patientCode"从任何可能的子节点开始。

我不知道我必须从层次结构的哪里开始。我唯一知道的是,我需要得到这个特定的父节点。

有人知道如何实现这一点吗?

任何帮助都非常感谢。

亲切的问候桑德罗

从任何可能的子节点中找到特定的父节点

试试这样的代码。如果代码结构正确,就不需要get parent

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();

        }
    }
}

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);

joined现在包含到根目录的路径,例如:

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

现在的问题是,我需要沿着路径获取元素"patientCode",就在"case"节点的正下方。

如何按照检索到的路径获取相关的元素数据,例如使用xPath ?