2012-01-15 61 views
1

如何通过其子节点获取节点值?例如,我有以下节点解析成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

我发现,使用改造下面的代码片段,它让几乎正是我想要的。可以通过更改输出方法来调整结果。

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

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

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

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

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

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

或者使用XPath像你一样:

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

内部,jOOX将使用一个变压器生成该输出,如其他人所述