你能得到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
答案 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中所做的那样,foo
和fOo
不是相同的变量。
修改强>
正如我所说,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