0

你能得到一个 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()工作吗?我找不到任何例子......

PS 大小写和大小写也很挑剔。你能以某种方式关闭它吗?

谢谢,-G

4

2 回答 2

2

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

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

因此,您可以使用以下内容:

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

摘自用户指南

考虑以下 XML 文档:

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

使用相同的 XPath,,getValue("/address/street")将返回字符串"Orchard Road",而 selectSingleNode("/address/street")- 元素类型的对象(DOM 或 JDOM,取决于所使用的解析器的类型)。返回的 Element 当然是<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 中所做的那样,foo并且fOo不是相同的变量。


编辑:

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

关于text(),它是 XPath 1.0 的一部分,XPath 2 不需要使用它。JXPathgetValue()已经在text()为您进行调用。如果你想自己做,你将不得不使用selectSingleNode("//whatever/text()")它将返回一个Object类型TextElement(取决于底层解析器)。

综上所述,该方法JXPathContext.getValue()已经为您完成了选择节点文本内容的工作,因此您无需自己完成并显式调用 XPath 的text().

于 2012-11-15T21:59:53.073 回答
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());

如果没有,您将获得标签和值。如果你想做更多,看看这个

于 2012-12-05T20:32:03.690 回答