4

我只是想知道那里有没有好的完整的。我所说的不可变是指始终不可变的。如果库包含 freeze() 或等效方法以使某些值实例不可变,那么请在您的回复中记下这一点。我最感兴趣的是在对所述节点进行更改时返回新副本的库。

首先,我将列出一些不是不可变的常见库。

http://xerces.apache.org/xerces-j/apiDocs/org/w3c/dom/Element.html

removeAttributeNS(java.lang.String namespaceURI, java.lang.String localName) 通过本地名称和命名空间 URI 删除属性。void setAttribute(java.lang.String name, java.lang.String value) 添加一个新属性。

http://www.jdom.org/docs/apidocs/org/jdom2/Comment.html

Comment setText(java.lang.String text) 这将设置 Comment 的值。

请注意,所有重要的类都包括 setter。

http://www.xom.nu/apidocs/index.html?nu/xom/Attribute.html

setType(Attribute.Type 类型)

       Sets the type of this attribute to one of the ten DTD types or Type.UNDECLARED.  void  setValue(String value) 

       Sets the attribute's value to the specified string, replacing any previous value.

如果您对不可变性杀死性能有任何意见,那么可以自由发表意见,但要提供一些真正美味的信息,而不是无聊的意见。

4

1 回答 1

3

也许您只是使用了错误的语言——Scala 和 Clojure 都有带有不可变节点的 XML 库。我认为不可变数据结构的概念在 Java 社区中还不够流行,以至于有人基于它来开发整个生产就绪的 XML 库。

如果您愿意引入整个 Scala 库 jar,那么也许您可以围绕Anti-XML库编写一些不错的 Java 包装器并使用它。可以从 Java代码调用 Scala 库,但根据我的经验,这有点痛苦。

更新:

由于您似乎没有得到任何其他点击,这可能是您最可行的选择。我之前正在研究它,用 Java 为 Anti-XML 编写一个包装器将是一个可怕的痛苦——但在 Scala 中编写一个 Java 友好的接口然后从 Java 访问该接口并不是那么糟糕。Anti-XML 的Zippers似乎正是您通过复制来更新不可变 XML 树所需要的。对深拉链的支持似乎有点不便,但它可能不会破坏交易。

于 2012-08-18T06:48:02.570 回答