String xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
            + "<!DOCTYPE xml [<!ENTITY copy \"&#169;\"> "
            //the next line is missing in output
            + "<!ENTITY logo SYSTEM \"http://www.xmlwriter.net/logo.gif\" NDATA gif>"
            + "<!ENTITY deg \"&#x00b0;\"> ]>\n" + "<root />";

    SAXReader reader = new SAXReader(false);
    reader.setIncludeInternalDTDDeclarations(true);
    reader.setIncludeExternalDTDDeclarations(true);

    Document doc = reader.read(new StringReader(xml));
    StringWriter wr = new StringWriter();
    XMLWriter writer = new XMLWriter(wr);
    writer.write(doc);

    String xml2 = wr.toString();
    System.out.println(xml2);


这是例子。但是我发现这是输出



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml [
  <!ENTITY copy "©">
  <!ENTITY deg "°">
]><root/>





您可以看到,它错过了一行。我做了一些研究。
打印的实体声明称为内部(已解析)实体声明。缺少的行称为外部(未解析的)实体声明。

因为我想读取xml,所以更改一些值并导出而不丢失任何数据

我的问题是:

1)问题出在哪里,丢失的数据已被读入Document对象,或者问题发生在编写器中,就像我错过了一些配置一样。

2)如何解决问题?

最佳答案

答案:

1)从SAXContentHandler的来源很明显:

public void unparsedEntityDecl(String name, String publicId,
        String systemId, String notationName) throws SAXException {
    // #### not supported yet!
}


2)也许扩展SAXContentHandler,创建一个UnparsedEntityDecl并设置一个自定义XMLReader。尝试另一个库可能更容易,也许JDOM2

关于java - 如何通过dom4j在xml中读取和打印外部(未解析的)通用实体声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35580695/

10-09 05:33