【问题标题】:Find particular parent node from any possible child node从任何可能的子节点中查找特定的父节点
【发布时间】:2016-10-21 09:02:03
【问题描述】:

刚刚遇到了一个新的 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”。

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

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

非常感谢任何帮助。

亲切的问候 桑德罗

【问题讨论】:

  • 在 XDocument 中加载 xml。然后在这里查看接受的答案stackoverflow.com/questions/451950/get-the-xpath-to-an-xelement。然后在获得当前元素的路径后,搜索父元素并仅获取您需要的部分。
  • 注意到我的问题文本中没有写某些文本 -> 已更正谢谢 Lidaranis,但这对我不起作用。我得到了一个巨大的路径列表,但我仍然有一个问题,我不知道起始点在哪里。请再看看我的问题
  • 如果我明白这一点,请告诉我。您希望根据 case 元素的其中一个子元素来搜索 patientCode。例如,获取氧饱和度/百分比 == 97 的部分代码,但您的搜索所基于的节点(此处为氧饱和度/百分比)是动态的。我在正确的轨道上吗?
  • 是的。 XML 已生成(序列化),因此我无法采用另一种 xml 生成方式。为了更好地理解这可能会有所帮助:用例是我针对 xsd 验证 xml。我编写了一个显示验证错误的应用程序。双击错误将在富文本框中标记导致错误的相关元素。我需要向用户显示属于所选元素(节点)的患者代码。在每种情况下,此信息都位于 PatientCode 元素中。所以你是绝对正确的:)
  • 应用程序应该针对序列化的类而不是 xml 文件编写。您可以为每个指向父类的类添加一个私有属性。然后在执行序列化后运行一个实用程序来填写父项。私有属性被序列化忽略。

标签: c# xml linq parsing


【解决方案1】:

试试这样的代码。如果代码结构正确,则不需要获取父级

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


        }
    }

}

【讨论】:

  • 非常感谢jdweng,可惜我不能用这种实现方式。 XML 是通过对复杂的类结构进行序列化而创建的。根据数据,某些 XML-Elements 不会被序列化等。因此内容和结构并不总是相同的。
【解决方案2】:

更新

好的,我有另一个想法:

我知道选择了哪个节点。有了这个,我可以像这样获得到根目录的路径

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)

现在的问题是我需要按照路径获取“case”节点正下方的元素“patientCode”。

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

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 2017-03-14
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多