2016-05-18 13 views
-1

Ich habe die folgende XML-Datei:Wie man Dinge aufräumt wie & # x00FA; in XML?

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<authors><![CDATA[&#x00E3; &#x00FA; ]]></authors> 
</root> 

Ich möchte &#x00FA; zu ú konvertieren. Die folgende Methode zum Aufrufen von tidy funktioniert nicht. Weiß jemand, wie man es richtig nennt?

tidy --preserve-entities no --output-encoding utf8 tmp1.xml > tmp2.xml 

Antwort

0

In Java ein generisches Muster suchen und ersetzen.

Die folgenden Suchen nach + optional x (hexadezimal) + Nummer + ;.

String fillInNumericEntities(String xml) { 
    Pattern entityPattern = Pattern.compile("\\&#([Xx]?)([\\w]+);"); 
    StringBuffer sb = new StringBuffer(xml.length()); 
    Matcher m = entityPattern.matcher(xml); 
    while (m.find()) { 
     int numBase = m.group(1).isEmpty() ? 10 : 16; 
     String number = m.group(2); 
     try { 
      int codePoint = Integer.parseInt(number, numBase); 
      int[] codePoints = new int[] { codePoint }; 
      String ch = new String(codePoints, 0, 1); 
      m.appendReplacement(sb, ch); 
     } catch (NumberFormatException e) { 
     } 
    } 
    m.appendTail(sb); 
    return sb.toString(); 
} 

Eine Bemerkung: Der Browser kann eine Quelle der automatischen Übersetzung von Sonderzeichen in numerischen Einheiten sein, vor allem, wenn die HTML-<form accept-charset="UTF-8"> fehlt.

2

Ein CDATA-Abschnitt wie

<![CDATA[&#x00E3; &#x00FA;]]> 

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

&amp;#x00E3; &amp;#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;