我不了解StreamResult
实例会发生什么。我看到Transformer
对象收到source
和streamResult
:
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
对象是封装了StringWriter
的流编写器。然后将此streamResult
对象传递给transform
方法,该方法将其结果写入StreamResult
,该方法又将结果写入StringWriter
。然后,可以在toString
上调用StringWriter
方法以查看转换的字符串化结果。回答第二个问题:某些方法由于效率和灵活性而不会返回其结果。例如,假设执行了大量的转换。如果返回结果,则需要为这些转换中的每个转换创建一个新对象。在传入结果对象(称为out参数)的情况下,可以重复使用同一结果对象。其次,返回结果会消除一些灵活性,因为它不允许用户指定应如何编写结果。在您的情况下,您可以传递包裹在
StringWriter
中的StreamResult
,但是您也可以轻松地传递实现Result
接口的任何对象。使用lambda表达式和函数式编程可以对这种类型的out参数进行一些替代,但是在编写XML转换接口时,out参数是一种常见的做法(在某些情况下仍然是)。