如何读取和打印 dom4j xml 中的外部(未解析)一般实体声明
how to read and print external (unparsed ) general entity Declaration in xml by dom4j
String xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
+ "<!DOCTYPE xml [<!ENTITY copy \"©\"> "
//the next line is missing in output
+ "<!ENTITY logo SYSTEM \"http://www.xmlwriter.net/logo.gif\" NDATA gif>"
+ "<!ENTITY deg \"°\"> ]>\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);
这是我创建的example.but,这是输出
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml [
<!ENTITY copy "©">
<!ENTITY deg "°">
]><root/>
你可以看到,它漏掉了一行。我做了一些研究。
打印的实体声明称为内部(已解析)实体声明。缺少的行称为外部(未解析)实体声明。
因为我想阅读xml,更改一些值并在不丢失任何数据的情况下导出
我的问题是:
1) 哪里有问题,Document 对象中读入了缺失的数据,或者是 writer 中出现了问题,比如我遗漏了一些配置。
2) 如何解决问题?
答案:
1) 从 SAXContentHandler 的来源来看非常明显:
public void unparsedEntityDecl(String name, String publicId,
String systemId, String notationName) throws SAXException {
// #### not supported yet!
}
2) 可能会扩展 SAXContentHandler,创建一个 UnparsedEntityDecl 并设置一个自定义 XMLReader。可能更容易尝试另一个库,也许 JDOM2
String xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
+ "<!DOCTYPE xml [<!ENTITY copy \"©\"> "
//the next line is missing in output
+ "<!ENTITY logo SYSTEM \"http://www.xmlwriter.net/logo.gif\" NDATA gif>"
+ "<!ENTITY deg \"°\"> ]>\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);
这是我创建的example.but,这是输出
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml [
<!ENTITY copy "©">
<!ENTITY deg "°">
]><root/>
你可以看到,它漏掉了一行。我做了一些研究。 打印的实体声明称为内部(已解析)实体声明。缺少的行称为外部(未解析)实体声明。
因为我想阅读xml,更改一些值并在不丢失任何数据的情况下导出
我的问题是:
1) 哪里有问题,Document 对象中读入了缺失的数据,或者是 writer 中出现了问题,比如我遗漏了一些配置。
2) 如何解决问题?
答案:
1) 从 SAXContentHandler 的来源来看非常明显:
public void unparsedEntityDecl(String name, String publicId,
String systemId, String notationName) throws SAXException {
// #### not supported yet!
}
2) 可能会扩展 SAXContentHandler,创建一个 UnparsedEntityDecl 并设置一个自定义 XMLReader。可能更容易尝试另一个库,也许 JDOM2