org.xml.sax.SAXParseException для японского символа. Содержимое элементов должно состоять из правильно сформированных символьных данных или разметки
Получаем следующее сообщение об ошибке в программе Java, если HTML имеет следующий японский символ.
ファミリーコンパクト 270ml ●植物成分使用●型番:コンパクト●容量(mL):270●しつこい油汚れをスッキリ落とします。
Использование org.w3c.tidy.Tidy для анализа HTML, а затем использование org.xhtmlrenderer.pdf.ITextRenderer для создания PDF.
Ошибка:
ERROR: 'The content of elements must consist of well-formed character data or markup.'
Exception in thread "main" org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException; lineNumber: 187; columnNumber: 65; The content of elements must consist of well-formed character data or markup.
at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:191)
at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:71)
at org.xhtmlrenderer.swing.NaiveUserAgent.getXMLResource(NaiveUserAgent.java:211)
at org.xhtmlrenderer.pdf.ITextRenderer.loadDocument(ITextRenderer.java:134)
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:149)
at me.preekmr.Main.convertHTMLToPDF(Main.java:66)
at me.preekmr.Main.main(Main.java:27)
Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 187; columnNumber: 65; The content of elements must consist of well-formed character data or markup.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:740)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:343)
at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:189)
... 6 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 187; columnNumber: 65; The content of elements must consist of well-formed character data or markup.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:659)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:728)
... 8 more
1 ответ
Проблема была с выходной кодировкой парсера Tidy.
Ранее Tidy-парсер считывает HTML-код с использованием входной кодировки UTF-8 и выводит с использованием той же кодировки UTF-8. Но средство визуализации org.xml.* Не может проанализировать некоторые символы UTF-8. Следовательно было исключение разбора.
Теперь, после установки выходной кодировки Tidy в ASCII, он преобразует не-ASCII-символы в сущности (ссылки на символьные сущности) и, следовательно, правильно обрабатывается XML-рендерером.
tidy.setInputEncoding("UTF-8");
tidy.setOutputEncoding("ASCII");