Java XML Prettyprinting 包含 DTD 注释?
Java XML Prettyprinting incorporates DTD Comments?
当使用内置 Java 解析 XML 数据时(使用 jdk 8u151 和 8u161 测试)XML 处理引擎我得到了奇怪的结果。如果我在 DTD 中使用参数化实体引用,则来自 DTD 的所有 以下 SGML 注释最终会出现在输出文档中。
这是我的(最小)代码 运行:
import java.io.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
public class FormatBug {
public static void main( String[] args ) throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
Reader in = new FileReader( args[0] );
Writer out = new FileWriter( args[1] );
t.transform( new SAXSource( new InputSource(in) ), new StreamResult(out) );
out.flush();
out.close();
}
}
源文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc><p>This is a <b>bold</b> line.</p></doc>
DTD (doc.dtd) 如下所示:
<!ELEMENT doc (p+)>
<!ENTITY % floats "b" >
<!-- comment before -->
<!ELEMENT p ( #PCDATA | %floats; )*>
<!-- comment after -->
<!ELEMENT b (#PCDATA)>
结果如下所示:
<!-- comment after --><!DOCTYPE doc SYSTEM "doc.dtd">
<doc><p>This is a <b>bold</b> line.</p></doc>
将 p 的规则替换为
<!ELEMENT p ( #PCDATA | b )*>
虚假评论消失。
谁能解释一下这是怎么回事?
我还检查了 JDK 9.0.4,其中 所有评论 都被复制了,所以我认为我可能做错了一些事情。
我可以确认这发生在 JDK 1.8.0_151,并认为这是一个问题,因为使用 SAXSource
作为转换的输入源,因为 。
以下使用 StAX 的变体不会在 JDK 1.8 上打印虚假注释,因此可能有助于在 JDK 1.8 上获得统一的 Java 源代码 运行和 1.9:
import java.io.*;
import javax.xml.stream.*;
import javax.xml.transform.*;
import javax.xml.transform.stax.*;
import javax.xml.transform.stream.*;
public class FormatBugUsingStaX {
public static void main(String[] args) throws Exception {
InputStream inputStream = new FileInputStream(args[0]);
InputStreamReader in = new InputStreamReader(inputStream);
XMLInputFactory factory = XMLInputFactory.newInstance();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
XMLStreamReader streamReader = factory.createXMLStreamReader(in);
Writer out = new FileWriter(args[1]);
t.transform(new StAXSource(streamReader), new StreamResult(out));
}
}
编辑:如果您打算保留评论,您可能会幸运地使用另一个 StAX 实现;比照。 Transforming a StAX Source in Java
当使用内置 Java 解析 XML 数据时(使用 jdk 8u151 和 8u161 测试)XML 处理引擎我得到了奇怪的结果。如果我在 DTD 中使用参数化实体引用,则来自 DTD 的所有 以下 SGML 注释最终会出现在输出文档中。
这是我的(最小)代码 运行:
import java.io.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
public class FormatBug {
public static void main( String[] args ) throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
Reader in = new FileReader( args[0] );
Writer out = new FileWriter( args[1] );
t.transform( new SAXSource( new InputSource(in) ), new StreamResult(out) );
out.flush();
out.close();
}
}
源文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc><p>This is a <b>bold</b> line.</p></doc>
DTD (doc.dtd) 如下所示:
<!ELEMENT doc (p+)>
<!ENTITY % floats "b" >
<!-- comment before -->
<!ELEMENT p ( #PCDATA | %floats; )*>
<!-- comment after -->
<!ELEMENT b (#PCDATA)>
结果如下所示:
<!-- comment after --><!DOCTYPE doc SYSTEM "doc.dtd">
<doc><p>This is a <b>bold</b> line.</p></doc>
将 p 的规则替换为
<!ELEMENT p ( #PCDATA | b )*>
虚假评论消失。
谁能解释一下这是怎么回事?
我还检查了 JDK 9.0.4,其中 所有评论 都被复制了,所以我认为我可能做错了一些事情。
我可以确认这发生在 JDK 1.8.0_151,并认为这是一个问题,因为使用 SAXSource
作为转换的输入源,因为
以下使用 StAX 的变体不会在 JDK 1.8 上打印虚假注释,因此可能有助于在 JDK 1.8 上获得统一的 Java 源代码 运行和 1.9:
import java.io.*;
import javax.xml.stream.*;
import javax.xml.transform.*;
import javax.xml.transform.stax.*;
import javax.xml.transform.stream.*;
public class FormatBugUsingStaX {
public static void main(String[] args) throws Exception {
InputStream inputStream = new FileInputStream(args[0]);
InputStreamReader in = new InputStreamReader(inputStream);
XMLInputFactory factory = XMLInputFactory.newInstance();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
XMLStreamReader streamReader = factory.createXMLStreamReader(in);
Writer out = new FileWriter(args[1]);
t.transform(new StAXSource(streamReader), new StreamResult(out));
}
}
编辑:如果您打算保留评论,您可能会幸运地使用另一个 StAX 实现;比照。 Transforming a StAX Source in Java