【发布时间】:2016-12-31 16:40:28
【问题描述】:
我正在处理一个带有数据的Document 对象,一些节点有与之关联的userData(使用setUserData(<key>, <value>, <handler>))。我想将文档的副本保存到 XML,并将 userData 值导出为属性。
变压器
这是我知道的输出 XML 的方式:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(<Document>);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
但是我无法找到一种方法来连接新旧 Node 对象都存在的方法——我在挖掘 Transformer 时唯一能找到的地方是一个将节点转换为的类 DOM2TO例如。 SAX 调用 startElement(...),但如果不复制粘贴整个代码,我无法在此处更改任何内容。
用户数据处理程序
我的第二种方法是使用 UserDataHandler 与 userData 一起附加到节点。该处理程序必须提供一个名为 handle(short operation, String key, Object data, Node src, Node dst) 的方法,例如。克隆节点时。因此,可以编写一个 UserDataHandler 来检查 src 节点中的 userData 并将其作为属性添加到 dst,然后在从克隆写入 XML 之前简单地克隆 Document。 不幸的是,handle(...)在dst节点克隆未完成的阶段被调用:当src具有属性时,dst将指向同一个AttributeMap实例时间。因此,整个过程毫无价值,因为添加的属性也会添加到原始 Document 中,我不想这样做。
【问题讨论】: