簡體   English   中英

Java XML Prettyprinting包含DTD注釋嗎?

[英]Java XML Prettyprinting incorporates DTD Comments?

當使用內置Java(經jdk 8u151和8u161測試)的XML處理引擎解析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作為轉換的輸入源,因為Java的javax.xml.parsers.SAXParser忽略了注釋

以下使用StAX的變體不會在JDK 1.8上打印虛假注釋,因此可能有助於實現在JDK 1.8和1.9上都運行統一的Java源代碼:

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實現很幸運; cf. 用Java轉換StAX源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM