2014-01-08 4 views
0

Мне нужно заменить определенный текст в 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; 
    } 
} 
+0

Согласно W3C, существует много избыточного трафика DTD, см. Http://www.w3.org/blog/systeam/2008/ 02/08/w3c_s_excessive_dtd_traffic/ Что напоминает вопрос, вам действительно нужен ваш dtd? Я буду преследовать и отвечать на этот вопрос, но подумал, что сначала попрошу предоставить образец кода, который выходит из строя без доступа к dtd. – OYRM

+0

XML-файл для преобразования не создается мной. Это библиотека iTunes. Я не хочу возиться с самой библиотекой. – s3lph

+2

Большинство синтаксических анализаторов XML и, по крайней мере, некоторые XSLT-процессоры имеют API, который позволяет писать и подключать код, который может обеспечить специальную интерпретацию некоторых или всех URL-адресов/URI. Это можно использовать для распознавания запроса DTD и возврата входного потока, полученного из любой точки - от строки в памяти до локального файла в кеш-файл, в зависимости от того, сколько работы вы хотите сделать. Обычно это называется «DTD Resolver» или «Entity Resolver», в зависимости от того, какой API вы используете для запуска таблицы стилей. – keshlam

ответ

4

Вы можете создать разрешение сущности, и использовать его.

Следующий пример использует JAXP DocumentBuilder, и CatalogResolver

public static void main(String[] args) throws ParserConfigurationException, 
     SAXException, IOException, TransformerConfigurationException, TransformerException { 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    db.setEntityResolver(new CatalogResolver()); 

    File src = new File("src/article.xml"); 
    Document doc = db.parse(src); 

    // Here, we execute the transformation 
    // Use a Transformer for output 
    File stylesheet = new File("src/aticle.xsl"); 
    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    StreamSource stylesource = new StreamSource(stylesheet); 
    Transformer transformer = tFactory.newTransformer(stylesource); 

    DOMSource source = new DOMSource(document); 
    StreamResult result = new StreamResult(System.out); 
    transformer.transform(source, result); 
} 

создать каталог свойств файла, и поместить его на пути к классам CatalogManager.properties должен быть имя, см CatalogManager API documentation

определить файл каталога в каталоге, указать файл свойств выше. Из http://www.xml.com/pub/a/2004/03/03/catalogs.html вы можете найти очень простой каталог XML файл:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 
    <public publicId="-//OYRM/foo" uri="src/bar.dtd"/> 
</catalog> 

С выше catalog.xml и CatalogManager.properties, вы в конечном итоге разрешения ссылки на publicId «- // OYRM/Foo» в УИР SRC/bar.dtd XML-Обще содержит распознаватель:

http://xerces.apache.org/mirrors.cgi#binary

для более полного лечения темы резольверов читать Tom White's article from XML.com

Приложение трансформатора было вырезано из Java-трассы для расширяемых преобразований языка StyleSheet>Transforming Data with XSLT

+0

И как я могу предоставить документ Document для трансформатора? – s3lph

+0

Редактировать Получил это сам: 'новый DOMSource (doc)'. Большое спасибо. – s3lph

+1

Я отредактировал выше, чтобы завершить преобразование и отправить данные в System.out ... Рад, что вы получили его @the_Seppi, но я решил закончить редактирование для завершения. – OYRM

Смежные вопросы