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