Java 如何在jxpath中使用text()

Java 如何在jxpath中使用text(),java,text,xpath,jxpath,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&

您可以获取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("/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()?我找不到任何例子

另外,它对案例和资本化也非常挑剔。你能把它关掉吗

谢谢,
-G

/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 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不需要使用它。JXPath
getValue()
已经在为您调用
text()
。如果你想自己做,你必须使用
selectSingleNode(“//whatever/text()”)
,它将返回类型为
TextElement
(取决于底层解析器)的
对象


总之,方法
JXPathContext.getValue()
已经为您选择了节点的文本内容,因此您不需要自己选择,并且显式地调用XPath的
text()

/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 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不需要使用它。JXPath
getValue()
已经在为您调用
text()
。如果你想自己做,你必须使用
selectSingleNode(“//whatever/text()”)
,它将返回类型为
TextElement
(取决于底层解析器)的
对象


总之,方法
JXPathContext.getValue()
已经为您选择了节点的文本内容,因此您不需要自己选择,也不需要从我在该方法之前阅读的文章中显式调用XPath的
text()

。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());

如果没有,您将获得标记和值。如果你想做更多的事情,请看一看我在方法之前看过的一篇文章。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());

如果没有,您将获得标记和值。如果您想做更多的事情,请查看

,尽管它可能有效,但它不起作用。我得到null(除非lenient关闭),否则我得到一个异常。另外/action/pingPOS[1]/PingStep/text()为空。此外,A在Action中和P在PingPOS中必须是小写的,但PingStep必须是实际情况,否则就不能工作。这并不是一个易于使用的界面!顶级/AXISWeb似乎从来都不起作用。那么
//PingPOS[1]/PingStep
呢?如果我将大小写更改为bean-like://PingPOS[1]/PingStep,那么//PingPOS[1]/PingStep将变为“to-POS”(注意在PingPOS和PingStep中都不是大写的“P”)。但问题是为什么text()不起作用。文本是XPath2.0的一部分吗?我很确定这是XPath1.0的一部分。我能不能在一个标记中获取整个XML槽?例如POS2012-11-1516:35:57?也许我想返回一段XML。虽然它可能有效,但它不起作用。我得到null(除非lenient关闭),否则我得到一个异常。另外/action/pingPOS[1]/PingStep/text()为空。此外,A在Action中和P在PingPOS中必须是小写的,但PingStep必须是实际情况,否则就不能工作。这并不是一个易于使用的界面!顶级/AXISWeb似乎从来都不起作用。那么
//PingPOS[1]/PingStep
呢?如果我将大小写更改为bean-like://PingPOS[1]/PingStep,那么//PingPOS[1]/PingStep将变为“to-POS”(注意在PingPOS和PingStep中都不是大写的“P”)。但问题是为什么text()不起作用。文本是XPath2.0的一部分吗?我很确定这是XPath1.0的一部分。我能不能在一个标记中获取整个XML槽?例如POS2012-11-1516:35:57?也许我想返回一段XML。