gpt4 book ai didi

java - 在 Java 中序列化 Document 对象,同时保留任意元素的格式

转载 作者:数据小太阳 更新时间:2023-10-29 02:47:11 25 4
gpt4 key购买 nike

我正在使用下面的函数将 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 元素)。所以我有两个问题:

  1. 有没有办法像上面的代码一样在 Java 中格式化 XML 时跳过某些元素?
  2. 如果不是,是否有另一种方法可以将 Document 转换为 String 同时保留任意元素的布局?

请注意,我过去也使用过 Transformer(请参阅 Getting xml string from Document in Java),但未保留 CDATA 部分。

更新:

我很清楚,我正在反序列化和序列化 XML 以创建一个可以通过 DOM 以编程方式编辑的 Document 对象,序列化过程最好“漂亮地打印”生成的 XML(除了一些任意的元素)。

更新 2:

最后,我创建了一个自定义函数,用于将 Node 转换为具有可选格式的 String。请参阅 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);

最佳答案

序列化旨在通过传输介质获取数据,但不一定(甚至通常)以符合输入数据形式的方式,如果该形式根据定义不携带任何额外信息(如XML 文档的情况)。

如果您也需要延续设计,则必须将此“元”信息(即格式)编码到数据本身中,例如通过转义空格等。这可能是最简单的解决方案,但会防止你简单地“阅读”(就像用你的眼睛)传输流,是用 Base64 之类的东西对你的格式化数据进行编码。这将在 XML 包装器内完美传输,同时保持您输入编码器的原始输入数据的保真度。

另一方面,当然,您必须再次解码数据,然后才能继续进一步处理它。

关于java - 在 Java 中序列化 Document 对象,同时保留任意元素的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8293109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com