【发布时间】:2014-01-08 20:44:39
【问题描述】:
在将 XML 文件中的某些文本提供给 XSL-Transformer 之前,我需要替换它。
它是DOCTYPE 标记中的DTD-URL。它指向一个网络服务器,但我希望它可以离线使用,所以我想将其更改为指向本地文件的 URL。
但是我不能直接编辑原始 XML。我想将文件读入字符串,在文本上使用String.replaceAll() 并将其保存到另一个文件中,然后将其传递给 Transformer。我已经试过了,但是真的很慢;我正在使用的文件大小为 ca. 500kiB。
有没有更好(=更快)的方法来实现这一点?
EDIT:用于转换的代码:
public String getPlaylist(String playlist) {
Source source = new StreamSource(library);
StreamSource xsl = new StreamSource(getClass().getResourceAsStream("M3Utransformation.xml"));
StringWriter w = new StringWriter();
Result result = new StreamResult(w);
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
transformer.setParameter("playlist", playlist);
transformer.transform(source, result);
return w.getBuffer().toString();
} catch (Throwable t) {
t.printStackTrace();
return null;
}
}
【问题讨论】:
-
根据 W3C 的说法,有很多过多的 DTD 流量,请参阅w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic 这让我想到了一个问题,你真的需要你的 dtd 吗?我会追查并回答这个问题,但我想我会先要求您提供无法访问 dtd 失败的代码示例
-
要转换的 XML 文件不是我创建的。这是一个 iTunes 库。我不想弄乱图书馆本身。
-
大多数 XML 解析器,以及至少一些 XSLT 处理器,都有一个 API,允许您编写和插入可以对部分或全部 URL/URI 提供特殊解释的代码。这可用于识别 DTD 请求并返回从您想要的任何地方获得的输入流——范围从内存中的字符串到本地文件到文件缓存,具体取决于您想要做多少工作。这通常称为“DTD 解析器”或“实体解析器”,具体取决于您用于运行样式表的 API。