【问题标题】:XPath returns for one element but doesn't return the other?XPath 返回一个元素但不返回另一个?
【发布时间】:2019-12-16 19:18:45
【问题描述】:

我正在使用 Java 通过 XPath 提取值。我能够提取元素 fields 下的元素,但未返回 records 下的元素。

XML如下:

    <?xml version="1.0" ?>
    <qdbapi>
        <action>****</action>
        <errcode>0</errcode>
        <errtext>No error</errtext>
        <qid>****</qid>
        <qname>****</qname>
      <table>
        <fields>            
        <field id="19" field_type="text" base_type="text">
        </field>
        </fields>
        <records>
        <record>
        <f id="6">1</f>
        </record>
        </records>
    </table>
  </qdbapi>

代码如下:

XMLDOMDocObj.selectNodes("//*[local-name()='fields']")//21 fields returned
XMLDOMDocObj.selectNodes("//*[local-name()='records']")//no records are returned

【问题讨论】:

    标签: java xml xpath dom4j


    【解决方案1】:

    XML 必须有一个根元素;你的有两个:fieldsrecords

    将它们包装在一个公共根中以获得您期望的结果。

    此外,如果您的 XML 没有名称空间,则没有理由打败它们。而不是

    //*[local-name()='records']
    

    使用

    //records
    

    另见

    【讨论】:

    • 现在按预期为您完成 XPath 的两项工作?
    • 只有一个 Xpath 值有效,即“字段”,但“记录”Xpath 无效。您对“//记录”的建议也没有奏效。对于字段,结果是 QBQueryResult:21,但对于记录,结果是 QBQueryResult:0。 “QBQueryResult”是我的结果计数
    • 为我工作://*[local-name()='records'](点击查看。)
    • 是的,这行得通!!! //*[本地名称()='记录']。但是两者都不起作用..//*[local-name()='records']/*[local-name()='record']。也 //*[local-name()='records']//record 没有工作。 Xpath 在线测试仪没有返回错误。 下至少有 4 条记录
    • 我的答案中列出的两个 XPath 都适用于您的(更正后的)XML。 //records/record 也是如此。由于您的原始问题已解决,我建议您接受此答案,并针对您遇到的任何其他问题发布一个完整的新问题minimal reproducible example
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多