jev*_*von 4 java xml doctype dom
我正在尝试使用Java 中的 W3C DOM API读取 XML 文档并将其输出到新的 XML 文档中。为了处理 DOCTYPE,我使用以下代码(从输入 Documentdoc到目标 File target):
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // omit '<?xml version="1.0"?>'
trans.setOutputProperty(OutputKeys.INDENT, "yes");
// if a doctype was set, it needs to persist
if (doc.getDoctype() != null) {
DocumentType doctype = doc.getDoctype();
trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctype.getSystemId());
trans.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctype.getPublicId());
}
FileWriter sw = new FileWriter(target);
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);
Run Code Online (Sandbox Code Playgroud)
这对于带有和不带有 DOCTYPE 的 XML 文档都适用。然而,我现在NullPointerException在尝试转换以下输入 XML 文档时遇到了问题:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE permissions >
<permissions>
// ...
</permissions>
Run Code Online (Sandbox Code Playgroud)
HTML 5对其DOCTYPE使用类似的语法,并且它是有效的。但我不知道如何使用 W3C DOM API 来处理这个问题 - 尝试将其设置DOCTYPE_SYSTEM为null引发异常。我仍然可以使用 W3C DOM API 输出空文档类型吗?
虽然这个问题已经有两年了,但它是某些网络搜索引擎中的热门搜索结果,所以也许它是一个有用的快捷方式。请参阅问题Set HTML5 doctype with XSLT参考http://www.w3.org/html/wg/drafts/html/master/syntax.html#doctype-legacy-string,其中显示:
对于无法输出带有短 DOCTYPE“
<!DOCTYPE html>” 的 HTML 标记的 HTML 生成器,可以将DOCTYPE 旧字符串插入到 DOCTYPE [...]换句话说,
<!DOCTYPE html SYSTEM "about:legacy-compat">or<!DOCTYPE html SYSTEM 'about:legacy-compat'>,不区分大小写,除了单引号或双引号中的部分。
导致一行 Java 代码如下:
trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "about:legacy-compat");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4318 次 |
| 最近记录: |