【问题标题】:Why does XMLStreamReader/StAXSource strip comments from XML?为什么 XMLStreamReader/StAXSource 会从 XML 中去除注释?
【发布时间】:2013-03-25 09:27:24
【问题描述】:

下面的代码(基于http://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/util/xml/StAXSource.html的示例代码)

String xml = "<a><b>a text</b><!--a comment--><b/></a>";
StringReader sr = new StringReader(xml);
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(sr);
Source source = new StAXSource(reader);     
//Source source = new StreamSource(sr);
Result result = new StreamResult(System.out);      
TransformerFactory.newInstance().newTransformer().transform(source, result);

产生以下结果:

<?xml version="1.0" encoding="UTF-8"?><a><b>a text</b><b/></a>

即它去掉了 xml 注释。如果我将 StAXSource/XMLStreamReader 替换为 StreamSource,则保留注释。

有谁知道为什么 XMLStreamReader/StAXSource 组合会将它们剥离出来,是否有任何方法可以阻止它?测试是在没有第三方 jar 的 1.6 和 1.7 环境中完成的,所以 XMLStreamReader 变成了一个

com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl 

谢谢

【问题讨论】:

    标签: java xml stax xml-comments xmlstreamreader


    【解决方案1】:

    编辑: 刚刚按照here 的描述进行了尝试,即

    case XMLStreamConstants.COMMENT:
      System.out.print("<!--");
      if (xmlr.hasText())
         System.out.print(xmlr.getText());
    ...
    

    它确实读取了 cmets。这还没有回答最初的问题......

    【讨论】:

    • “罪魁祸首”是 StAXStream2SAX,它是 Xalan 从 Stax 的 XMLStreamReader 源执行身份转换的默认方式。它将 cmets 转换为无操作(我的 jdk8 上的第 386 行)。似乎没有办法解决这个问题,除了切换 Source 实现或 XSLT 实现。
    猜你喜欢
    • 2014-09-18
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多