Java 如何在jxpath中使用text()
您可以获取jxpath元素的text(),还是它不起作用 给出一些漂亮的xml: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&
<?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()
已经应该返回节点的文本内容,所以根本不需要使用XPathtext()
因此,您可以使用以下选项:
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不需要使用它。JXPathgetValue()
已经在为您调用text()
。如果你想自己做,你必须使用selectSingleNode(“//whatever/text()”)
,它将返回类型为TextElement
(取决于底层解析器)的对象
总之,方法JXPathContext.getValue()
已经为您选择了节点的文本内容,因此您不需要自己选择,并且显式地调用XPath的text()
/AXISWeb/Action/PingPOS[1]/PingStep/text()
对于您的文档来说是有效的XPath
但是,从jxpath的用户指南(注意:我根本不知道jxpath)中可以看到,getValue()
已经应该返回节点的文本内容,所以根本不需要使用XPathtext()
因此,您可以使用以下选项:
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不需要使用它。JXPathgetValue()
已经在为您调用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。