入力からXMLを生成するレガシーシステムを扱っています。この入力には、時にはの垂直タブ制御文字が含まれています。これらの文字は、結果のXMLにエンコードされます。垂直タブは、\u000B
というJava文字列で記述することができます。ここで何が起こるかを示すコード例だ(元のプロセスは、入力から文字列を受け取り、そして任意の前処理なしでテキストノードを作成):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("<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文書を生成します
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(theResultFromAbove)));
そして再びDocumentインスタンスを生成します。
は今、私は同じパーサ、すなわちを使用する必要があります。しかし、これはで失敗します。
[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)
私は2番目のパーサーのコントロールを持っているので、私はそれが出力を解析する前に
を置き換える&検索することができます。私は、最初にXMLを生成するコードをいくつか制御しているので、このすべてが発生する前に垂直タブを削除するだけで済みます。
しかし、パーサはそれだけを符号化しないようにかが
エンティティを実装する追加私はに何ができる何かがありますが、また、それを適切にデコードしますか?
おかげで、これは完全に質問に答えます。新しく導入されたバグを探すのではなく... – sm4