获取节点原始文本

时间:2012-01-15 21:08:39

标签: java dom

如何通过子节点获取节点值?例如,我将以下节点解析为dom Document实例:

<root>
    <ch1>That is a text with <value name="val1">value contents</value></ch1>
</root>

我使用xpath选择ch1节点。现在我需要获取其内容,<ch1></ch1>之间的所有内容,例如That is a text with <value name="val1">value contents</value>

我该怎么做?

4 个答案:

答案 0 :(得分:1)

如果这是服务器端java(即您不必担心它在其他jvm上运行)并且您使用的是Sun / Oracle JDK,则可以执行以下操作:

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

...

Node n = ...;
OutputFormat outputFormat = new OutputFormat();
outputFormat.setOmitXMLDeclaration(true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLSerializer ser = new XMLSerializer(baos, outputFormat);
ser.serialize(n);
System.out.println(new String(baos.toByteArray()));

请记住,如果解析后的xml dom的文本节点的编码与平台默认的不同,或者你会对不常见的字符产生垃圾,那么确保最终转换为字符串可能需要采用编码参数。

答案 1 :(得分:1)

您可以使用jOOX来包装DOM对象并从中获取许多实用程序功能,例如您需要的功能。在您的情况下,这将产生您需要的结果(使用CSS样式选择器来查找<ch1/>

String xml = $(document).find("ch1").content();

或者像你一样使用XPath:

String xml = $(document).xpath("//ch1").content();

在内部,jOOX将使用变换器生成该输出,正如其他人提到的那样

答案 2 :(得分:0)

据我所知,innerHTML中没有Document。 DOM旨在隐藏标记的细节。

您可以通过浏览该节点的子节点来获得所需的效果。例如,假设您要复制文本,但用编程提供的值替换每个“value”标记:

HashMap<String, String> values = ...;
StringBuilder str = new StringBuilder();
for(Element child = ch1.getFirstChild; child != null; child = child.getNextSibling()) {
    if(child.getNodeType() == Node.TEXT_NODE) {
        str.append(child.getTextContent());
    } else if(child.getNodeName().equals("value")) {
        str.append(values.get(child.getAttributes().getNamedItem("name").getTextContent()));
    }
}
String output = str.toString();

答案 3 :(得分:0)

我找到了以下使用转换的代码片段,它几乎可以提供我想要的内容。可以通过更改输出方法来调整结果。

public static String serializeDoc(Node doc) {
        StringWriter outText = new StringWriter();
        StreamResult sr = new StreamResult(outText);
        Properties oprops = new Properties();
        oprops.put(OutputKeys.METHOD, "xml");
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = null;
        try {
            t = tf.newTransformer();
            t.setOutputProperties(oprops);
            t.transform(new DOMSource(doc), sr);
        } catch (Exception e) {
            System.out.println(e);
        }
        return outText.toString();
    }