我可以在不转义属性值的情况下创建 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-&gt;foo"/>

有没有一种舒适的方法来创建节点而不在属性值中转义&gt;s?

【问题讨论】:

作为此特定用例的解决方法,我目前已使用嵌套的 &lt;conf&gt; 元素来指定配置,从那时起我不需要任何 &gt;s 属性值. 【参考方案1】:

Ivy 使用 XML 解析器来读取模块描述符,因此它不会抱怨 &amp;gt; 实体引用。虽然属性值中的 > 是有效的 XML,但 JAXP 序列化不会以这种方式打印它并且无法配置它。

如果您出于美观原因要更改此设置,则必须在编写 XML 文件后替换它。

【讨论】:

那么groovy.util.Node 在内部使用 JAXP 将对象序列化为 XML 文本? 是的,就是这样。 哦,对了。我刚刚才意识到,在再次阅读您的答案后,&amp;gt; 在解析为 XML 时实际上会扩展为&amp;gt;... facepalm 我刚刚意识到,如果 &amp;gt; 不在代码引号中,*** 也会扩展 :-)

以上是关于我可以在不转义属性值的情况下创建 Groovy 节点吗?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy - 如何在不更新地图的情况下使用默认值获取地图值

如何在不使用 gsub 的情况下转义“

如何在不更改链接结构的情况下使用 \ 转义字符 (、)、[、]、*、_、:[]()

C#在不创建实例的情况下获取属性值?

Jquery在不使用值的情况下选择更改

如何在不丢失现有值的情况下编辑复选框