XPathExpression 选择忽略命名空间的子属性值

Posted

技术标签:

【中文标题】XPathExpression 选择忽略命名空间的子属性值【英文标题】:XPathExpression to select child attribute value ignoring the namespace 【发布时间】:2017-01-28 18:10:04 【问题描述】:

我对 XPathExpression 的工作还是很陌生,我正在尝试构建一个表达式来将属性值检索到我的自定义 java 对象中,即 Message。下面是一个虚拟 XML,其中有许多 message 节点。

我的 Java 代码应该读取这个 XML,并相应地为 messages 创建一个 Java 对象列表。

这是我尝试构建 XpathExpression 的条件。

    在此 Xpath jobReport/records/record/messages 中检查 title 是否具有值 TestCompany。如果有任何其他公司消息应跳过

我正在使用下面的 Xpath 表达式,但由于命名空间数据,它无法返回数据。现在我需要使用表达式跳过这些名称空间并获取 Title 值。

    jobReport/records/record/messages/*[local-name()='aa:title'] jobReport/records/record/messages/*[local-name()='aa:title'/text()='TestCompany'] //*[local-name()='aa:title'/text()='TestCompany']

j

<?xml version="1.0" encoding="UTF-8"?>
<jobReport>
    <jobID>123515412512221</jobID>
    <rundate>2016-09-16</rundate>
    <startTime>13:09:49</startTime>
    <endTime>13:10:39</endTime>
    <containsErrors>false</containsErrors>
    <records>
        <record>
            <recordid>20160920001</recordid>
            <primaryfilename>hello.pdf</primaryfilename>
            <result>
                <status>OK</status>
                <errorcode />
            </result>
            <messages>
                <aa:title xmlns="http://www.somedomain.com/example/test/xml/"
                    xmlns:aa="DummyProject/2016-04">TestCompany</aa:title>
                <aa:messageid xmlns="http://www.somedomain.com/example/test/xml/"
                    xmlns:aa="OP360CustomerArchive/2016-04">30.02.02.15.01</aa:messageid>
                <aa:messagefrom xmlns="http://www.somedomain.com/example/test/xml/"
                    xmlns:aa="OP360CustomerArchive/2016-04">FI</aa:messagefrom>
                <aa:messageto
                    xmlns="http://www.op.fi/hallintapalvelut/dokumenttirajapinta/xml/"
                    xmlns:aa="OP360CustomerArchive/2016-04">keijo</aa:messageto>
                <aa:mailid
                    xmlns="http://www.op.fi/hallintapalvelut/dokumenttirajapinta/xml/"
                    xmlns:aa="OP360CustomerArchive/2016-04">agreement</aa:mailid>
                <aa:phonenumber
                    xmlns="http://www.op.fi/hallintapalvelut/dokumenttirajapinta/xml/"
                    xmlns:aa="OP360CustomerArchive/2016-04">xml-tuote</aa:phonenumber>
            </messages>
        </record>
    </records>
</jobReport>

【问题讨论】:

【参考方案1】:

元素的local-name() 将不包含命名空间前缀。

所以,不要使用*[local-name()='aa:title'],而是使用*[local-name()='title']

【讨论】:

谢谢。但这并没有给我我想要的东西。我尝试使用以下表达式,但这只是给我命名空间而不是值,即 TestCompany jobReport/records/record/messages/*[local-name()='alertmethod'] 糟糕,这是一个错字,正在更正表达式 /jobReport/records/record/messages/*[local-name()='title'] 仔细检查: /jobReport/records/record/messages/*[local-name()='title'] does select aa:title as shown here.

以上是关于XPathExpression 选择忽略命名空间的子属性值的主要内容,如果未能解决你的问题,请参考以下文章

删除 XML 命名空间,同时忽略根中的命名空间

JAXB:如何在解组 XML 文档期间忽略命名空间?

XSLT 不忽略命名空间前缀

将 xml 数据序列化为 json 时忽略命名空间属性

Spark SQL CTE在查询中忽略命名空间

python对于操作xml 忽略命名空间 处理解析修改xml