我需要在将XML文件中的某个文本替换为XSL-Transformer之前替换它。
它是DOCTYPE
标记中的DTD-URL。它指向一个Web服务器,但我希望它可以脱机使用,所以我想将它更改为指向本地文件的URL。
但是我不能直接编辑原始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;
}
}
答案 0 :(得分: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
定义目录XML文件,将上面的属性文件指向它。从 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”的引用解析为uri src / bar.dtd xml-commons包含解析器:
http://xerces.apache.org/mirrors.cgi#binary
有关解析器主题的更完整处理,请阅读Tom White's article from XML.com
转换器应用程序是从Java跟踪中进行的,用于可扩展样式表语言转换&gt; Transforming Data with XSLT