我正在使用数据处理Document
对象,一些节点具有与之关联的userData(使用setUserData(<key>, <value>, <handler>)
)。我想将Document的副本保存到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(...)
,但如果没有copyPasting整个代码,我就无法更改。
UserDataHandler
我的第二种方法是使用UserDataHandler与userData一起连接到Node。该处理程序必须提供一个被称为例如的方法handle(short operation, String key, Object data, Node src, Node dst)
。什么时候克隆节点。因此,可以编写一个UserDataHandler来检查src
节点的userData,并将其作为属性添加到dst
,然后在从克隆编写XML之前简单地克隆文档。 很遗憾,handle(...)
在dst
节点克隆未完成的阶段被调用:当src
具有属性时,dst
将指向当时的AttributeMap
实例。因此,整个过程毫无价值,因为添加的属性也会添加到原始文档中,我不想这样做。
答案 0 :(得分:1)
解决了 - 我必须使用一个在NODE_IMPORTED
工作的UserDataHandler:然后使用完全克隆的handle(...)
节点调用dst
方法。
这不是一个很好的解决方案,因为克隆(hrm,导入)文档会使所需空间翻倍。