3

私はこのコードを持っています:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    DOMImplementation impl = builder.getDOMImplementation();
    Document xmldoc = impl.createDocument(null, null, null);

    Element root = xmldoc.createElement("root");
    Element textElement = xmldoc.createElement("text");
    Text textNode = xmldoc.createTextNode("");
    root.appendChild(textElement);
    textElement.appendChild(textNode);

    OutputFormat of = new OutputFormat("XML","UTF-8",true);
    of.setIndent(1);
    of.setIndenting(true);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();

    XMLSerializer serializer = new XMLSerializer(stream, of);
    // As a DOM Serializer
    serializer.asDOMSerializer();
    serializer.serialize(root);

    System.out.println(stream.toString());

私はこれをコンソールに入れます:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <text/>
</root>

しかし、私はこれを取得したい:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <text></text>
</root>

XMLSerializer を設定して複雑な空の要素を回避する方法を知っている人はいますか? ありがとう。

4

2 に答える 2

3

結果:ありえないと思います。XMLSerializer はそのような構成をサポートしていません。

分析: を呼び出すとserializer.serialize(root)BaseMarkupSerializer の serialize(Element)メソッドが呼び出されます。シリアル化するために渡すノードのタイプを定義し、それを処理する適切な方法を選択します。

テキスト ノードになると、XMLSerializer の serializeElement(Element)メソッドが呼び出されます。

// If element has children, then serialize them, otherwise
// serialize en empty tag.       
if (elem.hasChildNodes()) {
    //... irrelevant code...
    endElementIO( null, null, tagName );
} else {
    //... irrelevant code...
    _printer.printText( "/>" ); // <------ HARDCODED, NON-CONFIGURABLE
    //... irrelevant code...
}

問題: ご覧のとおり、空の要素を閉じる方法はハードコードされており、構成できません (ソース コードから完全なコード スニペットを探す場合)。

解決策: XMLSerializer は最終的なものではないため、それを拡張してそのメソッドをオーバーライドすることにより、独自のシリアライザーを作成できます。方法の 1 つが変更されます。

_printer.printText( "/>" );

_printer.printText( "</" );
_printer.printText( elem.getTagName() );
_printer.printText( ">" );

意見: クリーンな解決策がないかどうかはわかりませんが、この解決策は最後の手段と考えています。とにかく、詳細については、ソースやドキュメントを調べてください。

于 2012-05-23T21:20:17.097 に答える
1

XMLSerializer で空のタグのレンダリングのカスタマイズを許可しないという同じ問題がありました。私の解決策は、元の XMLSerializer コードを拡張し、serializeElement メソッドをオーバーライドすることでした。

元のコードをコピーして、最後の印刷部分を変更しました。

protected void serializeElement(Element elem) は IOException をスローし ます ...

if (isSelfClosingElement(elem))
    _printer.printText("/>");
else
_printer.printText("></" + elem.getTagName() + ">");

ここで、isSelfClosingElementは自己閉鎖要素のリストを保持します

注:さらに、 printAttribute()およびprintNamespaceAttr()メソッドをコピーする必要があります。これは、保護ではなくプライベートとマークされているためです。

于 2012-12-12T08:56:15.043 に答える