java - 如何通过 dom4j 读取和打印 xml 中的外部(未解析的)通用实体声明

标签 java xml entity dtd dom4j

    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/

相关文章:

forms - 在表单绑定(bind)之前克隆实体

java 8并行流问题

xml - 如何构造 XML 代码

java - 在 Java 中创建元组的最简单方法?

xml - 解析 XML 并输出到 Excel

java - 无法从类 : java. util.Map 的 JAXB 中发现 QNAme

entity-framework - 当我在 4.0 中构建它时更新我的​​ EF 模型以使用 4.1

wpf - ComboBox和 Entity Framework ,如何获取ID? (WPF-MVVM)

java - 我如何从 Hibernate 的第三张表中获取属性?

java - 如何使用架构组件观察数据库删除事件