Я имею дело с унаследованной системой, которая создает XML из ввода. Этот ввод иногда содержит вертикальные вкладки управляющие символы. Эти символы затем закодированы в полученном XML. Вертикальная вкладка может быть записана в строке Java как \u000B
. Вот пример, иллюстрирующий то, что происходит (исходный процесс принимает строку из входных данных, и создает текстовые узлы без предварительной обработки):Parse Vertical Tab Кодирующий символ присутствует в XML
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader("<xml></xml>")));
Element sample = doc.createElement("sample");
sample.appendChild(doc.createTextNode("Hello\u000BWorld"));
doc.getDocumentElement().appendChild(sample);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
Это создает документ XML, который является недействительным:
<?xml version="1.0" encoding="UTF-8"?><xml>
<sample>HelloWorld</sample>
</xml>
Теперь мне нужно использовать один и тот же анализатор, а именно:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(theResultFromAbove)));
И снова производят экземпляр документа. Но это не удается с:
[Fatal Error] :2:23: Character reference "&#
org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 23; Character reference "&#
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
У меня есть контроль второго синтаксического анализатора, так что я могу найти & заменить 
, прежде чем он разбирает вывод. У меня также есть некоторый контроль над кодом, который создает XML в первую очередь, поэтому я могу просто удалить вертикальные вкладки, прежде чем все это произойдет.
Однако есть то, что я мог сделать, чтобы добавить или реализовать в 
объект так анализатор может не только кодировать его, но и расшифровать его правильно?
Спасибо, это отвечает на вопрос совершенно. Не для поиска новых ошибок ... – sm4