2010-10-01 15 views
10

Mam następujący kod:XML parsowania problem z '&' w element tekstowy

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))); 

a etap parse jest throwning:

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

powodu następującego '&' w moim inputXml :

<Line1>Day & Night</Line1> 

Nie kontroluję w przychodzącym pliku XML. Jak mogę to bezpiecznie/poprawnie przeanalizować?

Odpowiedz

31

Po prostu dane wejściowe "XML" nie są prawidłowe. Jednostka powinna być kodowane, tj .:

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

Zasadniczo, nie ma „właściwego” sposób aby to naprawić inne niż mówienie dostawcę XML, który oni dając śmieci i coraz im go naprawić. Jeśli jesteś w jakiejś strasznej sytuacji, w której właśnie musisz sobie z tym poradzić, to podejście, które podejmiesz, będzie prawdopodobnie zależało od tego, jaki zakres wartości chcesz otrzymać.

Jeśli w dokumencie nie ma żadnych elementów, regex replace z & z &amp; przed przetworzeniem może załatwić sprawę. Ale jeśli wysyłają pewne elementy poprawnie, musisz je wykluczyć z dopasowania. A przy rzadkiej szansie, że faktycznie chcieli wysłać kod podmiotu (tj. Wysłano &amp;, ale oznaczało &amp;amp;), będziecie mieli całkowicie pecha.

Ale hej - to i tak wina dostawcy, a jeśli twoja próba poprawienia nieprawidłowych danych wejściowych nie jest dokładnie tym, czego szukała, jest prosta rzecz, którą mogą zrobić, aby rozwiązać ten problem. :-)

+0

Ach, dzięki za to. Obawiałem się, że tak było. Wygląda na to, że kilka telefonów jest w porządku :) –

+1

Hej, mam podobny problem, ale zastąpienie "i" przez "&" przed przetworzeniem (tj. StringEscapeUtils.unescapeHtml()) nie rozwiązuje mojego problemu? – dale

5

Twój wejściowy kod XML jest nieprawidłowy XML; niestety nie można realistycznie użyć parsera XML do parsowania tego.

Musisz przetworzyć tekst przed przesłaniem go do analizatora składni XML. Mimo że możesz zastąpić ciąg znaków zastępując '& ' przez '&amp; ', nie będzie to miało żadnego wpływu na każde wystąpienie & w danych wejściowych, ale możesz być w stanie wymyślić coś, co robi.

3

to inputXML ciąg znaków? Następnie użyj tego:

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

Dobry pomysł, ale jak wspomniano powyżej, należy uważać na podmioty w dokumencie. –

+1

Wypróbuj to rozwiązanie, które ma negatywne nastawienie: http://stackoverflow.com/a/1944951/107277 –

+0

Powinno to być inputXML = inputXML.replaceAll ("& \\ s +", "&"); –

4

użyłem Tidy ramy przed analizowania XML

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)))); 
... 

A wszystko Ok