Ein CDATA-Abschnitt wie
<![CDATA[ã ú]]>
ist nicht entspricht
<![CDATA[ã ú]]>
Innerhalb eines CDATA-Abschnitt, Charaktere wie &
, <
oder >
verlieren ihre besondere Bedeutung und sind buchstäblich behandelt. So oberhalb der CDATA-Abschnitt entspricht
&#x00E3; &#x00FA;
Ihre Umwandlung nicht „aufzuräumen“ XML-Datei, es die Zeichendaten tatsächlich ändert. Deshalb können Sie die gewünschte Transformation nicht mit einfachen Tools durchführen. Außerdem können Sie eine Regex normalerweise nicht blind anwenden, weil Sie andere Teile Ihrer XML-Datei, die möglicherweise ebenfalls CDATA-Abschnitte enthalten, nicht ändern möchten.
Wenn Sie wirklich Dateien wie beschrieben konvertieren möchten, sollten Sie wahrscheinlich ein kleines Programm in einer Skriptsprache Ihrer Wahl mit einer XML-Bibliothek schreiben. Dieses Programm sollte nur Entitäten in den Teilen der XML-Datei dekodieren, in denen die Konvertierung wirklich stattfinden soll. Siehe das folgende Perl-Skript, zum Beispiel:
use strict;
use XML::LibXML;
my $doc = XML::LibXML->new->parse_fh(\*STDIN);
# Process all text nodes within "authors" elements.
for my $authors_text ($doc->findnodes('//authors//text()')) {
my $text = $authors_text->data;
$text =~ s/&#x([0-9A-Fa-f]+);/chr(hex($1))/ge;
$authors_text->setData($text);
}
print $doc->toString;