2017-02-21 35 views
0

入力からXMLを生成するレガシーシステムを扱っています。この入力には、時にはの垂直タブ制御文字が含まれています。これらの文字は、結果のXMLにエンコードされます。垂直タブは、\u000BというJava文字列で記述することができます。ここで何が起こるかを示すコード例だ(元のプロセスは、入力から文字列を受け取り、そして任意の前処理なしでテキストノードを作成):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("<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番目のパーサーのコントロールを持っているので、私はそれが出力を解析する前に&#11;を置き換える&検索することができます。私は、最初にXMLを生成するコードをいくつか制御しているので、このすべてが発生する前に垂直タブを削除するだけで済みます。

しかし、パーサはそれだけを符号化しないようにか&#11;エンティティを実装する追加私はに何ができる何かがありますが、また、それを適切にデコードしますか?

答えて

2

ない、これはあなたのために動作するかどうかを確認しますが、1.0から1.1へのXMLのバージョンを変更するため0x0BまたはVT有効を含むドキュメントを作る、0x00以外のすべての制御文字が含まれるように、有効な文字のリストを開きます。変圧器に以下の設定を追加し、1.1にバージョンを設定するには

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

おかげで、これは完全に質問に答えます。新しく導入されたバグを探すのではなく... – sm4

関連する問題