Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取节点原始文本_Java_Dom - Fatal编程技术网

Java 获取节点原始文本

Java 获取节点原始文本,java,dom,Java,Dom,如何使用其子节点获取节点值?例如,我将以下节点解析为domDocument实例: <root> <ch1>That is a text with <value name="val1">value contents</value></ch1> </root> 这是一个包含有值内容的文本 我使用xpath选择ch1节点。现在我需要得到它的内容,在和之间包含的所有内容,例如是一个包含值内容的文本 我该怎么做呢?据我所

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

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

这是一个包含有值内容的文本
我使用xpath选择ch1节点。现在我需要得到它的内容,在
之间包含的所有内容,例如
是一个包含值内容的文本


我该怎么做呢?

据我所知,在
文档中没有与
innerHTML
等价的东西。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();
HashMap值=。。。;
StringBuilder str=新的StringBuilder();
对于(元素child=ch1.getFirstChild;child!=null;child=child.getNextSibling()){
if(child.getNodeType()==Node.TEXT\u节点){
str.append(child.getTextContent());
}else if(child.getNodeName().equals(“value”)){
str.append(values.get(child.getAttributes().getNamedItem(“name”).getTextContent());
}
}
字符串输出=str.toString();

我发现下面的代码段使用了转换,它几乎完全符合我的要求。可以通过改变输出方法来调整结果

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();
    }

如果这是服务器端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的文本节点采用的编码与平台默认编码不同,则最终转换为字符串可能需要采用一个编码参数,否则会在不寻常的字符上产生垃圾

您可以使用它包装DOM对象,并从中获取许多实用程序函数,例如您需要的函数。在您的情况下,这将产生您需要的结果(使用css样式选择器查找

或者像您一样使用XPath:

String xml = $(document).xpath("//ch1").content();
正如其他人所提到的,jOOX将在内部使用一个转换器来生成该输出

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