我正在尝试编写一个集成引擎,我在其中获得SOAP XML,它基本上包含db查询值,我必须从XML中提取并制定快速SQL查询。
问题是输入XML来自各种来源并具有任意模式。唯一常见的模式是我有两种类型的节点来提取值。它们包含简单类型和复杂类型。例如
<?xml version="1.0" encoding="UTF-8"?>
<for1:submittedData xmlns:for1="http://www.example.com/abc/1.1/">
<td conceptName="PostalAddress_StreetNumber" name="postal.streetNumber"/>
<td conceptName="PostalAddress_StreetName" name="postal.streetAddress"/>
<Reports conceptName="LaboratoryReport" minDateTime="2012-09-16T00:00:00.000" maxDateTime="2015-09-02T23:59:59.999" searchString="Loinc Test" order="dateDescend" name="clinical.diagnosticReport">
<SendingFacility conceptName="Report_SendingFacility" name="sendingFacility"/>
<Report_Subject conceptName="Report_Subject" name="name"/>
</Reports>
</for1:submittedData>
我想在一个Xpath查询中提取简单类型的所有属性值,例如PostalAddress_StreetNumber,postal.streetNumber,PostalAddress_StreetName,postal.streetAddress,然后是所有复杂类型LaboratoryReport,2012-09-16T00:00:00.000。对于复杂类型,要识别的规则是元素是否具有conceptName并且hasChildNodes ='true',则将其视为复杂类型。 相同Xpath必须工作的输入示例的另一个示例是:
<?xml version="1.0" encoding="UTF-8"?>
<form:submittedData xmlns:form="http://www.example.com/abc1/1.1/">
<html>
<body>
<table>
<tr>
<th>PostalAddress_StreetNumber</th>
<th>PostalAddress_StreetName</th>
</tr>
<td conceptName="PostalAddress_StreetNumber" name="postal.streetNumber"/>
<td conceptName="PostalAddress_StreetName" name="postal.streetAddress"/>
<tr conceptName="LaboratoryReport" minDateTime="2012-09-16T00:00:00.000" maxDateTime="2015-09-02T23:59:59.999" searchString="Loinc Test Results Ful" order="dateDescend" name="clinical.diagnosticReport">
<td conceptName="Report_SendingFacility" name="sendingFacility"/>
<td conceptName="Report_Subject" name="name"/>
</tr>
</table>
</body>
</html>
</form:submittedData>
我尝试将所有conceptNames提取为//@conceptName
。但我不知道如何在Xpath查询中制定这些规则。有人可以帮忙吗?
答案 0 :(得分:0)
要从复杂类型获取所有属性,可以使用以下XPath:
//*[@* and *]//@*
简要说明:
//*[@* and *]
:找到所有具有子元素和属性的元素...... //@*
:...然后从每个这样的元素及其后代元素中返回所有属性并使用以下内容从简单类型中获取所有属性:
//*[not(*)][not(parent::*[@* and *])]/@*
简要说明:
//*[not(*)]
:找到所有没有子元素的元素...... [not(parent::*[@* and *])]
:...并且没有匹配复杂类型标准的父元素... /@*
:...然后从每个这样的元素中返回所有属性