首页 > 解决方案 > XPath 连接相同的标记名

问题描述

我正在尝试根据给定的、连接相同 TagName 的值来生成一个 xml。例如,这是我到目前为止所做的:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class TestXPath {

    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
         String xml =
                    "<ROOT>" +
                    "    <coolnessId>9</coolnessId>" +
                    "    <cars id=\"3\">0</cars>" +
                    "    <cars id=\"2\">1</cars>" +
                    "    <cars id=\"1\">2</cars>" +
                    "</ROOT>";

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                factory.setNamespaceAware(true);

                Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
                XPath xpath = XPathFactory.newInstance().newXPath();

               ///XPathExpression expr = xpath.compile("concat(//ROOT/cars,'-',//ROOT/coolnessId)");//concat(//ROOT/cars)
                XPathExpression expr = xpath.compile("concat(//ROOT/cars,'-')");//concat(//ROOT/cars)
                // XPathExpression expr = xpath.compile( "concat(//*[contains(name(), 'cars')],'')");
            System.out.println(expr.evaluate(doc, XPathConstants.STRING)); 
    }
}

此代码产生:

0-

现在这应该是:

2-1-0

如您所见,这些值遵循每个“汽车”标签的属性“id”。我已经多次重蹈覆辙,但无法达到我的结果。请记住,我使用的是非常古老的环境,例如 Java 1.4 运行时。

标签: javaxpathjava1.4

解决方案


我认为最简单的方法是使用 XPath 检索节点,然后在 Java 代码中连接字符串值。

任何其他解决方案都涉及升级您的技术:XSLT、XPath 2.0+ 等,而这在 JDK 1.4 平台上并不容易。


推荐阅读