如何在jxpath中使用text()

时间:2012-11-15 21:47:27

标签: java text xpath jxpath

你能得到jxpath元素的text()还是不起作用?

给出了一些不错的xml:

<?xml version="1.0" encoding="UTF-8"?>
<AXISWeb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AXISWeb.xsd">
    <Action>
    <Transaction>PingPOS</Transaction>
    <PingPOS>
        <PingStep>To POS</PingStep> 
        <PingDate>2012-11-15</PingDate> 
        <PingTime>16:35:57</PingTime> 
    </PingPOS>
    <PingPOS>
        <PingStep>POS.PROCESSOR18</PingStep> 
        <PingDate>2012-11-15</PingDate> 
        <PingTime>16:35:57</PingTime> 
    </PingPOS>
    <PingPOS>
        <PingStep>From POS</PingStep> 
        <PingDate>2012-11-15</PingDate> 
        <PingTime>16:35:57</PingTime> 
    </PingPOS>
</Action>
</AXISWeb>

//不起作用:

jxpc.getValue("/AXISWeb/Action/PingPOS[1]/PingStep/text()");

//不起作用:

jxpc.getValue("/action/pingPOS[1]/PingStep/text()");

//不起作用:

jxpc.getValue("/action/pingPOS[1]/PingStep[text()]");

我知道我可以使用

获取文本
jxpc.getValue("/action/pingPOS[1]/PingStep");

但这不是重点。 text()不应该有用吗?我找不到任何例子......

P.S。案件和资本化也非常挑剔。你能以某种方式解决这个问题吗?

谢谢, -G

2 个答案:

答案 0 :(得分:2)

/AXISWeb/Action/PingPOS[1]/PingStep/text()是您文档的有效XPath

但是,从我从jxpath的用户指南中可以看到(注意:我根本不知道jxpath),getValue()已经应该返回一个节点的文本内容,所以你不要需要使用XPath text()

所以你可以使用以下内容:

jxpc.getValue("/AXISWeb/Action/PingPOS[1]/PingStep");

摘自user guide

  

考虑以下XML文档:

<?xml version="1.0" ?>
<address>
  <street>Orchard Road</street>
</address> 
     

使用相同的XPath,getValue("/address/street")将返回字符串"Orchard Road",而   selectSingleNode("/address/street") - Element类型的对象(DOM   或JDOM,具体取决于所使用的解析器类型)。返回的元素   当然是<street>Orchard Road</street>

现在关于标记名称的不区分大小写的查询,如果您使用的是XPath 2,则可以使用lower-case()node(),但这不是真正推荐的,您可以更好地使用正确的名称。

/*[lower-case(node())='axisweb']/*[lower-case(node())='action']/...

或者如果使用XPath 1,您可以使用translate(),但情况会更糟:

/*[translate(node(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'axisweb']/*[translate(node(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'action']/...

总而言之,尽量确保使用正确的查询,您知道它区分大小写,因此最好注意它。正如您在Java中所做的那样,foofOo不是相同的变量。


修改

正如我所说,XML和XPath区分大小写,因此pingStep无法匹配PingStep,请使用正确的名称来查找它。

关于text(),它是XPath 1.0的一部分,XPath 2不需要使用它。 JXPath getValue()已经在为您调用text()。如果您想自己动手,则必须使用selectSingleNode("//whatever/text()"),它将返回Object类型TextElement(取决于底层解析器)。

总而言之,方法JXPathContext.getValue()已经完成了为您选择节点文本内容的工作,因此您不需要自己动手并显式调用XPath的text()

答案 1 :(得分:1)

从我在方法之前发布过的帖子.getTextContent()为你完成工作。 评估Xpath时无需使用“text()”。

示例:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("D:\\Loic_Workspace\\Test2\\res\\test.xml"));


    System.out.println(doc.getElementsByTagName("retCode").item(0).getTextContent());

如果没有,您将获得标签和值。如果你想做更多的事情,请看看at this