用于在任意XML模式中提取属性值的Xpath

时间:2015-07-02 11:20:38

标签: xml xpath

我正在尝试编写一个集成引擎,我在其中获得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查询中制定这些规则。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

要从复杂类型获取所有属性,可以使用以下XPath:

//*[@* and *]//@*

简要说明:

  • //*[@* and *]:找到所有具有子元素和属性的元素......
  • //@*:...然后从每个这样的元素及其后代元素中返回所有属性

并使用以下内容从简单类型中获取所有属性:

//*[not(*)][not(parent::*[@* and *])]/@*

简要说明:

  • //*[not(*)]:找到所有没有子元素的元素......
  • [not(parent::*[@* and *])]:...并且没有匹配复杂类型标准的父元素...
  • /@*:...然后从每个这样的元素中返回所有属性