gpt4 book ai didi

java - 使用 javax.xml.transform.Transformer

转载 作者:行者123 更新时间:2023-11-30 01:57:05 25 4
gpt4 key购买 nike

我不明白 StreamResult 实例会发生什么。我看到 Transformer 对象接收 sourcestreamResult:

    transformer.transform(source, streamResult);

这会将 source 转换为 streamResult?奇怪的是,此 operation 没有返回任何内容。然而,由于缺乏更好的词,streamResult 现在有了数据。是 xml 数据吗?

package helloWorldSaxon;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Properties;
import java.util.logging.Logger;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class App {

private static final Logger LOG = Logger.getLogger(App.class.getName());
private final Properties properties = new Properties();

public static void main(String[] args) throws TransformerException, TransformerConfigurationException, IOException, SAXException {
LOG.fine("starting..");
new App().identyTransformOnURL();
}

private void identyTransformOnURL() throws TransformerConfigurationException, TransformerException, IOException, SAXException {
properties.loadFromXML(App.class.getResourceAsStream("/saxon.xml"));
String url = properties.getProperty("url");

StringWriter writer = new StringWriter();
StreamResult streamResult = new StreamResult(writer);

TransformerFactory factory = TransformerFactory.newInstance();
XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.ccil.cowan.tagsoup.Parser");
Source source = new SAXSource(xmlReader, new InputSource(url));

Transformer transformer = factory.newTransformer();
transformer.transform(source, streamResult);

String stringResult = writer.toString();
LOG.info(stringResult);
}

}

我不明白有关此方法的 JavaDoc:

Transform the XML Source to a Result. 

返回结果不是更直观吗?

最佳答案

相关行接受 XML 源和另一个对象(即 Result ),可以在其中写入转换结果。本质上,第二个参数是您提供的一个存储桶,它允许 transform方法来放置其结果。方法调用结束后,您将检索存储桶并从中取出结果。

在您的具体情况下:

transformer.transform(source, streamResult);

streamResult object 是一个流式编写器,封装了 StringWriter 。这个streamResult然后对象被传递到 transform方法,将其结果写入 StreamResult ,这又将结果写入 StringWriter 。然后您可以调用toString StringWriter上的方法查看转换的字符串化结果。

回答你的第二个问题:出于效率和灵 active 的考虑,某些方法不会返回结果。例如,假设执行大量转换。如果返回结果,则需要为每一个转换创建一个新对象。在传入结果对象(称为输出参数)的情况下,可以反复重用相同的结果对象。其次,返回结果消除了一些灵 active ,因为它不允许用户指定如何写入结果。就您而言,您可以传递 StringWriter包裹在 StreamResult 内,但是您也可以轻松地传入任何实现 Result 的对象界面。

对于这种类型的输出参数,有一些使用 lambda 表达式和函数式编程的替代方案,但在编写 XML 转换接口(interface)时,输出参数是一种常见做法(在某些情况下,现在仍然如此)。

关于java - 使用 javax.xml.transform.Transformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com