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

时间:2016-09-20 17:40:58

标签: java xml xpath xml-namespaces

我很擅长使用XPathExpression,我正在尝试构建一个表达式来将属性值检索到我的自定义java对象中,即Message。下面是虚拟XML,它将包含许多消息节点。

我的Java代码应该读取此XML,相应地它会为消息创建一个Java对象列表。

以下是我正在尝试构建XpathExpression的条件。

  1. 在此Xpath jobReport / records / record / messages 中,检查 title 的值是否为 TestCompany 。如果有任何其他公司消息应该被跳过
  2. 我正在使用下面的Xpath Expression,但由于Namespace数据而无法返回数据。现在我需要使用表达式跳过这些名称空间并获取标题值。

    1. jobReport /记录/记录/消息/ * [本地名称()= 'AA:标题']
    2. jobReport /记录/记录/消息/ * [本地名称()= 'AA:标题'/文本()= 'TestCompany']
    3. // * [本地名称()= 'AA:标题'/文本()= 'TestCompany']
    4. Ĵ

      <?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 个答案:

答案 0 :(得分:1)

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

因此,使用*[local-name()='aa:title']而不是*[local-name()='title']