我正在使用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());

09-30 17:22
查看更多