Java中将XML节点转换为字符串

41

我发现了一个将XML节点转换为Java字符串表示的Java函数:

private String nodeToString(Node node) {
    StringWriter sw = new StringWriter();
    try {
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        t.setOutputProperty(OutputKeys.INDENT, "yes");
        t.transform(new DOMSource(node), new StreamResult(sw));
    } catch (TransformerException te) {
        System.out.println("nodeToString Transformer Exception");
    }
    return sw.toString();
}

看起来很简单,它希望输出的字符串没有任何XML声明,并且必须包含缩进。

但我想知道实际输出应该是什么样的,假设我有一个XML节点:

<p><media type="audio" id="au008093" rights="wbowned">
<title>Bee buzz</title>
</media>Most other kinds of bees live alone instead of in a colony. These bees make
tunnels in wood or in the ground. The queen makes her own nest.</p>

我可以假设应用上述转换后的结果是什么字符串:
"media type="audio" id="au008093" rights="wbowned" title Bee buzz title /media"

我想亲自测试,但我不知道如何以此函数实际希望的方式表示此XML节点。
我有些困惑,在此先感谢您慷慨的帮助。
2个回答

49
重要的已经说完了。我试图编译以下代码。

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document; import org.w3c.dom.Node; public class Test {
public static void main(String[] args) throws Exception {
String s = "<p>" + " <media type=\"audio\" id=\"au008093\" rights=\"wbowned\">" + " <title>Bee buzz</title>" + " " + " 大多数其他种类的蜜蜂都是单独生活而不是在一个群体中。" + " 这些蜜蜂在木头或地面上挖掘隧道。" + " 蜂王会自己建造巢穴。" + "</p>"; InputStream is = new ByteArrayInputStream(s.getBytes());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document d = db.parse(is);
Node rootElement = d.getDocumentElement(); System.out.println(nodeToString(rootElement));
}
private static String nodeToString(Node node) { StringWriter sw = new StringWriter(); try { Transformer t = TransformerFactory.newInstance().newTransformer(); t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); t.setOutputProperty(OutputKeys.INDENT, "yes"); t.transform(new DOMSource(node), new StreamResult(sw)); } catch (TransformerException te) { System.out.println("nodeToString Transformer Exception"); } return sw.toString(); }
}

它生成了以下输出:


<p>  <media id="au008093" rights="wbowned" type="audio">    <title>Bee buzz</title>  </media>  大多数其他种类的蜜蜂都是单独生活而不是在一个群体中。这些蜜蜂在木头或地面上挖掘隧道。蜂王会自己建造巢穴。</p>

您可以根据需要进一步调整它。祝你好运!


对于普通读者,这里有一个调整过的版本:https://dev59.com/jpHea4cB1Zd3GeqPpnpt#33936257。 - Stephan

17
你有一个XML表示形式在DOM树中。 例如,你已打开了一个XML文件并将其传递给DOM解析器。 结果是在内存中创建了一个带有您的XML的DOM树。 现在,您只能通过遍历DOM树来访问XML信息。 如果需要DOM树的XML信息的字符串表示形式,则使用转换。 这是因为无法直接从DOM树中获取字符串表示形式。 因此,例如,如果您将作为Node node传递给nodeToString的节点是XML文档的根元素,则结果是包含原始XML数据的字符串。 标记仍然存在。也就是说,你将拥有一个有效的XML表示形式。只不过这一次将是在字符串变量中。
例如:
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder parser = factory.newDocumentBuilder();
  Document xmlDoc = parser.parse(file);//file has the xml
  String xml = nodeToString(xmlDoc.getDocumentElement());//pass in the root
  //xml has the xml info. E.g no xml declaration. Add it
  xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?> + xml;//bad to append this way...
  System.out.println("XML is:"+xml);

免责声明: 我甚至没有尝试编译代码。希望你理解你需要做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接