【发布时间】:2011-11-28 08:20:18
【问题描述】:
我正在使用下面的函数将 DOM 文档对象转换为 Java 中的字符串。
public static String convertDocumentToString(final Document doc) {
final DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
final LSSerializer lsSerializer = domImplementation.createLSSerializer();
lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
final String xml = lsSerializer.writeToString(doc);
return xml;
}
这在大多数情况下都很好用,但是有一些我不想格式化的特定元素(例如屏幕 DocBook 元素)。所以我有两个问题:
- 像上面的代码那样在 Java 中格式化 XML 时,有没有办法跳过某些元素?
- 如果没有,是否有另一种方法可以将文档转换为字符串,同时保留任意元素的布局?
请注意,我过去也使用过 Transformer(请参阅 Getting xml string from Document in Java),但这并没有保留 CDATA 部分。
更新:
我很清楚,我正在反序列化和序列化 XML,以便创建一个可以通过 DOM 以编程方式编辑的 Document 对象,序列化过程最好“漂亮地打印”生成的 XML(除了一些任意的元素)。
更新 2:
最后,我创建了一个自定义函数来将节点转换为具有可选格式的字符串。请参阅 https://sourceforge.net/p/commonclasses/code/110/tree/trunk/src/com/redhat/ecs/commonutils/XMLUtilities.java 处的 convertNodeToString 函数,调用方式如下:
final String exampleXml = FileUtilities.readFileContents(new File("test.xml"));
final ArrayList<String> contentsInlineElements = new ArrayList<String>();
contentsInlineElements.add("title");
contentsInlineElements.add("term");
final ArrayList<String> inlineElements = new ArrayList<String>();
inlineElements.add("prompt");
inlineElements.add("command");
inlineElements.add("firstterm");
inlineElements.add("ulink");
inlineElements.add("guilabel");
inlineElements.add("filename");
inlineElements.add("replaceable");
inlineElements.add("parameter");
inlineElements.add("literal");
inlineElements.add("classname");
inlineElements.add("sgmltag");
inlineElements.add("guibutton");
inlineElements.add("guimenuitem");
inlineElements.add("guimenu");
inlineElements.add("menuchoice");
inlineElements.add("citetitle");
final ArrayList<String> verbatimElements = new ArrayList<String>();
verbatimElements.add("screen");
verbatimElements.add("programlisting");
final Document doc = XMLUtilities.convertStringToDocument(exampleXml);
final String formattedXml = XMLUtilities.convertNodeToString(doc.getDocumentElement(), true, false, false, verbatimElements, inlineElements, contentsInlineElements, true, 1, 0);
【问题讨论】:
标签: java xml serialization