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

我的团队有这个问题,我们的解决方案是切换到使用元素,而不是属性。

+0

这是很好的知道,我已经通知那些生成XML,他们做错了......任何机会,你有一种方法来替换XML文件的属性与另一回车回车字符串我可以把回到回车时,当我阅读文本?在我等待真正的XML更改时,这是一个可以解决这个问题的黑客技术。 – billjamesdev 2010-04-30 20:56:04

+0

你可以尝试玩弄角色引用,如果这不起作用,可以自己处理自定义的可替换序列。 – SteveD 2010-05-01 07:30:08

我想你是在误读XML规范。换行符在属性值中是允许的,但是如果属性的声明值是标记化类型之一,则空白标准化。