输出DOM中的XML的实体定义(InternalSubset)

问题描述

在使用DOM解析XML并输出文件的过程中,实体定义不在输出的文件。

原XML:

<?xml version="1.0" encoding="UTF-8"?>
<!--Arbortext, Inc., 1988-2011, v.4002-->
<!DOCTYPE book PUBLIC "-//DocBook//DTD DocBook XML V4.0//EN" "dockbook.dtd" [
<!ENTITY logo SYSTEM "../graphics/logo.png" NDATA PNG>
]>
<book>
<title>Programming in Java<title>
<para>XXXX XXX</para>
</book>

使用如下代码解析并且输出到文件:

String xmlFilePath = "c:\\temp\\source.xml";
File xml = new File(xmlFilePath);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

CatalogResolver resolver = CatalogResolverFactory.getInstance().getCatalogResolver();
builder.setEntityResolver(resolver);
document = builder.parse();

TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();

Properties props = new Properties();
props.put(OutputKeys.INDENT, "yes");
props.put(OutputKeys.ENCODING, "utf-8");
transformer.setOutputProperties(props);

DOMSource source = new DOMSource(document);

String outputPath = "C:\\temp\\test.xml";
StreamResult result = new StreamResult(new File(outputPath));

transformer.transform(source, result);

输出结果:

<?xml version="1.0" encoding="UTF-8"?>
<!--Arbortext, Inc., 1988-2011, v.4002-->

<book>
<title>Programming in Java<title>
<para>XXXX XXX</para>
</book>

解决办法

代码中使用了Transformer进行XML输出,使用LSSerializer进行输出。代码如下:

StringBuffer xmlFileName = new StringBuffer();
xmlFileName.append("C:\\temp\\test.xml");
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();

LSOutput output = impl.createLSOutput();

FileWriter out = new FileWriter(new File(xmlFileName.toString()));
output.setCharacterStream(out);
writer.write(currentDocument, output);




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值