在將它提供給XSL-Transformer之前,我需要替換XML文件中的某些文本。 這是DOCTYPE
標記中的DTD-URL。它指向一個網絡服務器,但我希望它可以離線使用,所以我想將其更改爲指向本地文件的URL。在XSLT之前替換XML中的文本
但是,我不能直接編輯原始XML。我想將文件讀入字符串,在文本上使用String.replaceAll()
並將其保存到另一個文件中,然後將其傳遞給Transformer。我已經嘗試過了,但它確實很慢;我正在使用的文件的大小爲ca. 500kiB。
有沒有更好的方法來實現這個目標?
編輯:用於轉換的代碼:
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流量,請參閱http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic/ 這讓人想起這個問題,你真的需要你的dtd嗎? 我會追求並回答這個問題,但是我認爲我會首先要求您提供代碼示例,該示例在未訪問dtd時失敗 – OYRM
要轉換的XML文件不是由我創建的。這是一個iTunes資料庫。我不想搞亂圖書館本身。 – s3lph
大多數XML解析器和至少一些XSLT處理器都有一個API,它允許您編寫和插入代碼,以提供對部分或全部URL/URI的特殊解釋。這可以用來識別DTD請求並返回從您想要的任何位置獲取的輸入流 - 範圍從內存中的字符串到本地文件到文件緩存,具體取決於您想要做多少工作。 這通常被稱爲「DTD解析器」或「實體解析器」,具體取決於您使用哪個API來運行樣式表。 – keshlam