2017-02-21 25 views
0

Я имею дело с унаследованной системой, которая создает 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>Hello&#11;World</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) 

У меня есть контроль второго синтаксического анализатора, так что я могу найти & заменить &#11;, прежде чем он разбирает вывод. У меня также есть некоторый контроль над кодом, который создает XML в первую очередь, поэтому я могу просто удалить вертикальные вкладки, прежде чем все это произойдет.

Однако есть то, что я мог сделать, чтобы добавить или реализовать в &#11; объект так анализатор может не только кодировать его, но и расшифровать его правильно?

ответ

2

Не уверен, если это будет работать для вас, но изменения версии XML от 1,0 до 1,1 открывает список допустимых символов, чтобы включить все управляющие символы для 0x00 за исключением, что делает документ, содержащий 0x0B или VT действительное.

Чтобы установить версию 1.1, добавьте следующую конфигурацию к трансформатору:

transformer.setOutputProperty(OutputKeys.VERSION, "1.1"); 
+0

Спасибо, это отвечает на вопрос совершенно. Не для поиска новых ошибок ... – sm4