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>‰</b>'
def serialized = SE.unescapeXml(XmlUtil.serialize(xml))
assert '<?xml version="1.0" encoding="UTF-8"?><b>‰</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.
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
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