如何通过子节点获取节点值?例如,我将以下节点解析为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>
。
我该怎么做?
答案 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();
}