8

私のJavaプログラムは次のようになります:

public static void main(String[] args) {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    try {
        db = dbf.newDocumentBuilder();
        Document document = db.parse(new ByteArrayInputStream("<test><test1></test1></test>".getBytes("UTF-8")));
        StringWriter stringWriter = new StringWriter();
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.INDENT, "no");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
        transformer.transform(new DOMSource(document), new StreamResult(stringWriter));
        System.out.println(stringWriter.toString());
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    }
}

出力は: <test><test1/></test>I want output<test><test1></test1></test>です。

私はJasperReportshtmlスタイルを使用しているため、必要な出力のみが許可されます。それを達成する方法は?必要な出力を行うための Transformer の出力プロパティまたはDocumentBuilderFactoryのプロパティはありますか?

4

2 に答える 2

8

Transformer.transform を呼び出す前に次の行を追加すると、出力は HTML スタイルになります。

transformer.setOutputProperty(OutputKeys.METHOD, "html");
于 2014-01-13T09:42:01.570 に答える
3

Java の Transformer に完全な終了タグを書き込む方法は、Document を少し変更することです。私の場合、DOM を自分で構築します (文字列から XML を解析するのではなく)。自己終了タグを作成することがわかっているノードごとに、(残念ながら) ランダムなコンテンツを含む textNode を追加する必要があります。これは、他の子を追加しない要素に対して行うことです (したがって、自己終了タグになります)。

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element test = doc.createElement("test");
doc.appendChild(root);
Element element = doc.createElement("test1");
element.appendChild("_plchldr_"); // because we know it doesn't have children

既存の Document の場合、それをトラバースして、子を持たない要素を見つける必要があります。これらの同じプレースホルダーをそれらに追加します。

後で、この XML をライターにストリーミングするときに、生成された XML からこれらのプレースホルダーを削除する必要があります。

TransformerFactory factory = TransformerFactory.newInstance();
transformer.setOutputProperty("omit-xml-declaration", "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
// and here's the trick:
System.out.println( sw.toString().replaceAll("_plchldr_", "") );

または、「_plchldr_」ストリーミングを削除するラッピング ライターを使用することもできます。私の XML のサイズ (4KB 未満) を考慮して、わざわざ作成する必要はありませんでした。

別の方法として、出力からテキストを置き換えたくない場合は、テキスト ノードの代わりにコメントを追加できます。

element.appendChild(doc.createComment(" "));

結果は、有効な XML であるためにこれらのプレースホルダーを削除する必要はありませんが、出力に無意味なコメントが含まれます。

これは汚い回避策だと思いますが、少なくともうまくいきます!

于 2016-07-07T16:02:02.223 に答える