Groovy条带中的XML解析属性新行
问题描述:
我正在编写代码,从Web api检索XML,然后使用Groovy分析该XML。不幸的是,当调用.text()时,Groovy的XmlParser和XmlSlurper都会从节点的属性中剥离换行符。Groovy条带中的XML解析属性新行
如何获取属性的文本,包括新行?
示例代码:
def xmltest = '''
<snippet>
<preSnippet att1="testatt1" code="This is line 1
This is line 2
This is line 3" >
<lines count="10" />
</preSnippet>
</snippet>'''
def parsed = new XmlParser().parseText(xmltest)
println "Parsed"
parsed.preSnippet.each { pre ->
println pre.attribute('code');
}
def slurped = new XmlSlurper().parseText(xmltest)
println "Slurped"
slurped.children().each { preSnip ->
println [email protected]()
}
的输出是:
Parsed
This is line 1 This is line 2 This is line 3
Slurped
This is line 1 This is line 2 This is line 3
好吧,我能够将文本转换之前我解析它,然后重新转换后,一拉:
def newxml = xmltest.replaceAll(/code="[^"]*/) {
return it.replaceAll(/\n/, "~#~")
}
def parsed = new XmlParser().parseText(xmltest)
def code = pre.attribute('code').replaceAll("~#~", "\n")
不是我最喜欢的黑客,但它会做,直到他们修复他们的XML输出。
答
属性中不支持新行 - 这是来自XML规范。他们结束了“正常化”,在这种情况下,这意味着它们被替换为空格字符。看到这部分的规范:http://www.w3.org/TR/REC-xml/#AVNormalize
我的团队有这个问题,我们的解决方案是切换到使用元素,而不是属性。
答
我想你是在误读XML规范。换行符在属性值中是允许的,但是如果属性的声明值是标记化类型之一,则空白标准化。
这是很好的知道,我已经通知那些生成XML,他们做错了......任何机会,你有一种方法来替换XML文件的属性与另一回车回车字符串我可以把回到回车时,当我阅读文本?在我等待真正的XML更改时,这是一个可以解决这个问题的黑客技术。 – billjamesdev 2010-04-30 20:56:04
你可以尝试玩弄角色引用,如果这不起作用,可以自己处理自定义的可替换序列。 – SteveD 2010-05-01 07:30:08