2016-08-29 3 views
1
def xmlNode = new XmlSlurper().parseText('<?xml version="1.0" encoding="utf-8"?><b>&#8240;</b>') 
println XmlUtil.serialize(xmlNode) 

Drucke nächste:XmlSlurper wandelt HTML-codierten Symbole

<?xml version="1.0" encoding="UTF-8"?> 
<b> 
    ‰ 
</b> 

Gibt es Weise &#8240; in zu verhindern Umwandlung? XmlSlurper Dokumentation sagt nichts.

Antwort

2

Ich schrieb eine POC überschreiben XmlSlurper.characters, um die Zeichenentität zu behandeln. Apache commons StringEscapeUtils wurde auch konvertieren zurück zur Einheit Code benötigt:

@Grab(group='commons-lang', module='commons-lang', version='2.6') 

import org.apache.commons.lang.StringEscapeUtils as SE 
import groovy.xml.XmlUtil 

def parser = new XmlSlurper() { 
    void characters(char[] buffer, int start, int length) { 
     def entity = SE.escapeXml(buffer[start].toString()) 
     super.characters entity.toCharArray(), start, entity.size() 
    } 
} 

def xml = parser.parseText '<?xml version="1.0" encoding="utf-8"?><b>&#8240;</b>' 

def serialized = SE.unescapeXml(XmlUtil.serialize(xml)) 
assert '<?xml version="1.0" encoding="UTF-8"?><b>&#8240;</b>\n' == serialized 

Hinweis: Dies ist ein einzelnes Zeichen Handhabung, müssen Sie es ein bisschen zwicken, wenn Sie 'multi Handhabung benötigen. Beachten Sie auch, dass in der assert ein Zeilenumbruch benötigt wurde. Es wurde hinzugefügt von XmlUtil.serialize

Keine Ahnung, ob es der beste Weg ist, dies zu tun.

+0

Danke! Sieht gut aus. Wenn Sie jedoch versuchen, Daten aus der XML-Datei und 'super.characters' zu laden, wird die Ausnahme 'ArrayIndexOutOfBoundsException' ausgelöst. Wahrscheinlich liegt es an zusätzlichen Formatierungszeichen. 'buffer [start] .toString()' enthält eine leere Zeichenfolge. Hast du eine Idee? – eleven

+0

Sie könnten 'buffer [start..length-1] als String' oder etwas ähnliches benötigen. Sie können einige 'println' in Ihren Code einfügen oder den gesamten XML-Code posten, so dass wir erkennen können, welcher Char die Fehler verursacht. – Will