簡體   English   中英

Java xml自閉標簽

[英]Java xml self-closing tags

我的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>我想輸出<test><test1></test1></test>

因為我使用JasperReportshtml樣式只允許我想要的輸出。 怎么實現呢? Transformer的任何輸出屬性或DocumentBuilderFactory的任何屬性是否需要輸出?

如果在調用transformer.transform之前添加此行 - 輸出將采用html樣式:

transformer.setOutputProperty(OutputKeys.METHOD, "html");

使Java的Transformer編寫完整結束標記的一種方法是對Document進行少量更改。 在我的例子中,我自己構建DOM(而不是從String解析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

如果是現有文檔,則必須遍歷它以查找沒有子項的元素。 將這些相同的占位符添加到它們。

稍后,當將此XML流式傳輸到Writer時,必須從生成的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_", "") );

或者,您可以使用包裝Writer刪除“_plchldr_”流。 考慮到我的XML大小(<4KB),我沒有費心去寫一個。

另一種方法是,如果您不想從輸出中替換文本,則可以添加注釋而不是文本節點:

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

結果不需要將那些占位符刪除為有效的XML,但是,您的輸出中將有無意義的注釋。

我認為這是一個骯臟的解決方法,但它最不起作用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM