2012-12-13 59 views
4

我的Java程序是这样的:的Java XML自闭标签

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风格只允许我想要的输出。如何实现这一目标?是否有任何输出属性的变压器或任何属性DocumentBuilderFactory要做输出?

+0

[This question](http://stackoverflow.com/questions/5910963/how-to-make-javax-transformer-output-html-no-self-closing-tags)是类似的,并且有一些很好的讨论。 –

+0

[This question](http://stackoverflow.com/questions/1560762/xslt-wont-allow-me-to-use-self-closing-img-and-br-tags/1560815#1560815%5D)可能有帮助也是。 –

回答

4

如果你调用transformer.transform前添加此行 - 输出将在HTML风格:

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

你能提供一些解释吗? – Max

+0

如果您在调用** transformer.transform **之前添加此行,输出将采用html样式,正如作者所希望的那样。 – Boris

+0

这不起作用。我得到了空指针异常。 –

1

使Java的变压器写满关闭标签的方法是对文档变化不大。在我的情况下,我自己构建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我们的作家时,这些占位符必须从生成的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,但是,您将在输出中发表毫无意义的评论。

我认为这是一个肮脏的解决方法,但它至少工作!

+0

doc.createComment(“”)将xml转换为字符串并替换(“”,“”)适合我! – Peter