从Java中的XML中删除XML标头

时间:2011-04-11 03:17:44

标签: java xml

StringWriter  writer = new StringWriter();
XmlSerializer serializer = new KXmlSerializer();
serializer.setOutput(writer);
serializer.startDocument(null, null);
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
// Creating XML

serializer.endDocument();
String xmlString = writer.toString();

在上述环境中,是否有任何标准API可用于删除XML标头<?xml version='1.0' ?>,或者您是否建议通过字符串操作:

if (s.startsWith("<?xml ")) {
    s = s.substring(s.indexOf("?>") + 2);
}

希望xmlString的输出没有XML标题信息<?xml version='1.0' ?>

3 个答案:

答案 0 :(得分:79)

理想情况下,如果需要,您可以进行API调用以排除XML标头。 KXmlSerializer似乎不支持此功能(浏览代码here)。如果您有org.w3c.dom.Document(或实际上javax.xml.transform.Source的任何其他实现),您可以通过这种方式完成您想要的任务:

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));

否则,如果你必须使用KXmlSerializer,你似乎必须操纵输出。

答案 1 :(得分:18)

如果使用JAXP序列化程序,则可以访问XSLT中定义的所有输出属性,例如omit-xml-declaration="yes"。您可以使用“身份变换器”的形式获取此信息,使用不带参数的transformerFactory.getTransformer()进行调用,然后调用setOutputProperty()

答案 2 :(得分:0)

不要拨打电话:

serializer.startDocument();

它添加了XML标头,但您需要调用:

serializer.endDocument();

否则您的XML将被创建为空字符串。