2010-10-01 6 views
10

Ich habe den folgenden Code:Parsen von XML-Ausgabe mit '&' in Elementtext

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document document = builder.parse(new InputSource(new StringReader(inputXml))); 

Und der Parse-Schritt throwning:

SAXParseException: The entity name must immediately follow 
        the '&' in the entity reference 

aufgrund der folgenden '&' in meinem inputXml :

<Line1>Day & Night</Line1> 

Ich bin nicht in der Kontrolle der eingehenden XML. Wie kann ich das sicher/korrekt analysieren?

Antwort

31

Ganz einfach, die Eingabe "XML" ist kein gültiges XML. Das Unternehmen sollte codiert werden, d.h .:

<Line1>Day &amp; Night</Line1> 

Grundsätzlich gibt es keinen „richtigen“ Weg, um diese andere zu beheben, als die XML-Lieferanten zu sagen, dass sie ihren Müll geben und immer sie es zu beheben. Wenn Sie sich in einer fürchterlichen Situation befinden, in der Sie sich gerade damit auseinandersetzen müssen, hängt Ihre Vorgehensweise wahrscheinlich davon ab, welche Bandbreite an Werten Sie erwarten.

Wenn im Dokument überhaupt keine Entitäten vorhanden sind, würde ein Regex-Austausch von & mit &amp; vor der Verarbeitung den Zweck erfüllen. Wenn sie jedoch einige Entitäten korrekt senden, müssen Sie diese aus dem Abgleich ausschließen. Und bei der seltenen Möglichkeit, dass sie tatsächlich den Entitätscode senden wollten (d. H. Gesendet &amp;, aber gemeint war &amp;amp;), werden Sie völlig Pech haben.

Aber hey - es ist sowieso die Schuld des Lieferanten, und wenn Ihr Versuch, ungültige Eingabe zu korrigieren, nicht genau das ist, was sie wollten, gibt es eine einfache Sache, die sie tun können, um das zu beheben. :-)

+0

Ah, danke dafür. Ich hatte Angst, dass das der Fall war. Klingt wie ein paar Anrufe in Ordnung sind :) –

+1

Hey Leute, ich hatte ähnliches Problem, aber ersetzen "&" mit "&" vor der Verarbeitung (d. H. StringEscapeUtils.unescapeHtml()) behebt nicht mein Problem? – dale

5

Ihre Eingabe XML ist kein gültiges XML; Leider können Sie nicht realistisch einen XML-Parser verwenden, um dies zu analysieren.

Sie müssen den Text vorverarbeiten, bevor Sie ihn an einen XML-Parser übergeben. Obwohl Sie eine Zeichenfolge ersetzen können, '& ' durch '&amp; ' ersetzen, wird dies nicht jedes Auftreten von & in der Eingabe erfassen, aber Sie können in der Lage sein, mit etwas, das tut, zu kommen.

3

ist inputXML ein String? Dann folgt verwenden:

inputXML = inputXML.replaceAll("&\\s+", "&amp;"); 
+0

Gute Idee, aber wie oben erwähnt, müssen Sie auf die Entitäten im Dokument achten. –

+1

Versuchen Sie diese Lösung, die negative Vorausschau hat: http://stackoverflow.com/a/1944951/107277 –

+0

Sollte dies inputXML = inputXML.replaceAll ("& \\ s +", "&"); –

4

I verwendet Tidy Rahmen vor XML-Parsing

final StringWriter errorMessages = new StringWriter(); 
final String res = new TidyChecker().doCheck(html, errorMessages); 
... 
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = db.parse(new InputSource(new StringReader(addRoot(html)))); 
... 

Und das alles Ok