的Java XML自闭标签
我的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>
。
因为我使用JasperReports和html风格只允许我想要的输出。如何实现这一目标?是否有任何输出属性的变压器或任何属性DocumentBuilderFactory要做输出?
使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,但是,您将在输出中发表毫无意义的评论。
我认为这是一个肮脏的解决方法,但它至少工作!
doc.createComment(“”)将xml转换为字符串并替换(“”,“”)适合我! – Peter
[This question](http://*.com/questions/5910963/how-to-make-javax-transformer-output-html-no-self-closing-tags)是类似的,并且有一些很好的讨论。 –
[This question](http://*.com/questions/1560762/xslt-wont-allow-me-to-use-self-closing-img-and-br-tags/1560815#1560815%5D)可能有帮助也是。 –