我正在使用Xpath表达式从XML文档中获取文本节点,如下所示:
<company>
<emp>
<dept>Acct</dept>
<salary>1000</salary>
<proj>
<under>E01</under>
<under>E02</under>
</proj>
<name>John Doe</name>
<gender>male</gender>
</emp>
</company>
我编写了以下XPATH表达式来获取文本值:
normalize-space(string(//emp))
它正在提取正确的值,输出如下所示:
Acct1000E01E02John Doemale
请注意,来自不同节点的文本节点值之间没有空格。
我实际上希望输出值是这样的:
`Acct 1000 E01 E02 John Doe`
我已经使用
javax.xml.xpath
来解析和构建树,如下所示:DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new File("/employees.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "normalize-space(string(//emp))";
String output= (String)xPath.compile(expression).evaluate(document, XPathConstants.STRING);
我在这里使用JAVA SE 10。因此,Xpath版本是1.0
有没有更好的方法来提取文本值?
我对XPath很陌生,所以任何建议都将对您有所帮助。
最佳答案
您在这里几乎是严厉的。
选择not运算符是正确的方法。
应该是这样的:/html/body/company/emp/*[not(self::gender)]
即,除gender
节点外,emp的所有子节点。
这里有一个完整的JavaScript示例:
let xpathExpression = '/html/body/company/emp/*[not(self::gender)]';
let contextNode = window.document;
let xpathResult = document.evaluate(xpathExpression, contextNode,
null, XPathResult.ANY_TYPE, null);
console.log(xpathResult.iterateNext());
console.log(xpathResult.iterateNext());
console.log(xpathResult.iterateNext());
console.log(xpathResult.iterateNext());