Мне нужно заменить определенный текст в XML-файле, прежде чем передавать его в XSL-Transformer. Это DTD-URL в теге DOCTYPE
. Он указывает на веб-сервер, но я хочу, чтобы он использовался в автономном режиме, поэтому я хочу изменить его на URL-адрес, указывающий на локальный файл.Заменить текст в XML до XSLT
Однако я не должен редактировать исходный XML напрямую. Я думал о том, чтобы прочитать файл в строке, используйте текст String.replaceAll()
и сохраните его в другом файле, который я передаю в Transformer. Я уже пробовал, но это очень медленно; файл, который я использую, имеет размер ок. 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, см. 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 Resolver» или «Entity Resolver», в зависимости от того, какой API вы используете для запуска таблицы стилей. – keshlam