我可以在不转义属性值的情况下创建 Groovy 节点吗?
Posted
技术标签:
【中文标题】我可以在不转义属性值的情况下创建 Groovy 节点吗?【英文标题】:Can I create a Groovy Node without escaping attribute values? 【发布时间】:2013-09-10 15:50:30 【问题描述】:我正在编写一个用于构建 Ivy 模块描述符的 Gradle 构建脚本。我需要Node
喜欢
<dependency [...] conf="default->foo"/>
我想这样做:
node.dependencies[0].appendNode("dependency", [
// [...]
conf: "default->$dep.configuration",
])
其中node
是一个节点实例,dep.configuration == 'foo'
。但结果是
<dependency [...] conf="default->foo"/>
有没有一种舒适的方法来创建节点而不在属性值中转义>
s?
【问题讨论】:
作为此特定用例的解决方法,我目前已使用嵌套的<conf>
元素来指定配置,从那时起我不需要任何 >
s 属性值.
【参考方案1】:
Ivy 使用 XML 解析器来读取模块描述符,因此它不会抱怨 &gt;
实体引用。虽然属性值中的 > 是有效的 XML,但 JAXP 序列化不会以这种方式打印它并且无法配置它。
如果您出于美观原因要更改此设置,则必须在编写 XML 文件后替换它。
【讨论】:
那么groovy.util.Node
在内部使用 JAXP 将对象序列化为 XML 文本?
是的,就是这样。
哦,对了。我刚刚才意识到,在再次阅读您的答案后,&gt;
在解析为 XML 时实际上会扩展为&gt;
... facepalm
我刚刚意识到,如果 &gt;
不在代码引号中,*** 也会扩展 :-)以上是关于我可以在不转义属性值的情况下创建 Groovy 节点吗?的主要内容,如果未能解决你的问题,请参考以下文章
Groovy - 如何在不更新地图的情况下使用默认值获取地图值