2010-04-30 3 views
1

웹 API에서 XML을 검색 한 다음 Groovy를 사용하여 해당 XML을 구문 분석하는 코드를 작성하고 있습니다. 안타깝게도 Groovy의 XmlParser와 XmlSlurper는 .text()가 호출 될 때 노드 속성에서 줄 바꿈 문자를 제거하는 것으로 보입니다.XML Groovy에서 구문 분석 스트립 특성 새 줄

의 텍스트에서 줄 바꿈을 포함하여을 어떻게 얻을 수 있습니까?

샘플 코드 :입니다

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 출력이 수정 될 때까지 수행됩니다.

답변

2

새로운 행은 속성에서 지원되지 않습니다. 이는 XML 사양에 있습니다. 그들은 '정규화'를 마쳤습니다.이 경우에는 공백 문자로 대체됩니다. 사양의 다음 섹션을 참조하십시오. http://www.w3.org/TR/REC-xml/#AVNormalize

팀에서이 문제가 발생했으며 해결 방법은 속성이 아닌 요소 사용으로 전환하는 것이 었습니다.

+0

XML을 생성하는 사람들에게 XML 파일의 속성에있는 캐리지 리턴을 다른 것으로 대체 할 수있는 기회가있을 가능성을 알았습니다. char string 텍스트를 읽을 때 캐리지 리턴에 BACK을 넣을 수 있습니까? 실제 XML 변경을 기다리는 동안이 문제를 해결할 수있는 해킹입니다. – billjamesdev

+0

글자 참조로 놀아 볼 수도 있고, 작동하지 않는다면 직접 처리 할 수있는 사용자 지정 교체 가능 시퀀스를 사용해 볼 수도 있습니다. – SteveD

0

XML 스펙을 잘못 읽고 있다고 생각합니다. 속성 값에 개행 문자를 사용할 수 있지만 속성의 선언 된 값이 토큰 화 된 유형 중 하나 인 경우 공백이 표준화됩니다.