从任何可能的子节点中找到特定的父节点
本文关键字:父节点 任何可 子节点 | 更新日期: 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 ?