下面是我用Java生成XML的代码片段。我正在使用jdk1.8.0_152,下面的示例用于构造XML元素。

DocumentBuilder dBuilder= DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = dBuilder.parse(new InputSource(new StringReader(xmlString)));
doc.getDocumentElement().normalize();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
returnXML = writer.toString();


上面的代码返回

<?xml version="1.0" encoding="UTF-8"?><TYPE>star</TYPE>


在JBossAS [6.1.0]上返回

  <?xml version="1.0" encoding="UTF-8" standalone="no"?><TYPE>star</TYPE>


在Jetty9.1上。
不确定我缺少什么。Document类和基础的TransformerFactory应该相同,因为我们对两者都使用相同的Java1.8。

最佳答案

在某些情况下,jaxp API会在类路径中搜索“提供者”。当它在类路径上找到最高优先级的提供程序时,将使用该实现。如果在类路径上未找到提供程序,它将默认使用JVM提供的实现(系统默认)。

有关此过程的更多信息,请参见DocumentBuilderFactory.newInstance()

这是您提到的两个容器的不同之处(开箱即用):

JBoss AS 6.1-JBoss随附Xerces 2.9.1,这是一个jaxp服务提供商

Jetty-Jetty没有打包jaxp服务提供者,因此jaxp默认为JVM提供的实现

在这种特定情况下,JVM提供的实现将添加您引用的standalone属性。

07-27 14:05