java - 使用 javax.xml.transform.Transformer
问题描述
我不明白StreamResult
实例会发生什么。我看到Transformer
对象接收source
和streamResult
:
transformer.transform(source, streamResult);
这转变source
为streamResult
? 奇怪的是,这个操作没有返回任何东西,但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 参数)的情况下,可以反复重用相同的结果对象。其次,返回结果消除了一些灵活性,因为它不允许用户指定应该如何写入结果。在您的情况下,您可以传入 aStringWriter
包裹的 a StreamResult
,但您也可以轻松传入任何实现该Result
接口的对象。
使用 lambda 表达式和函数式编程可以替代这种类型的 out 参数,但在编写 XML 转换接口时,out 参数是一种常见做法(在某些情况下仍然如此)。
推荐阅读
- python - 使用 SortValues 函数指示两列具有相同的值
- swift - SwiftUI 动画旋转故障@360/0 度标记
- reactjs - 在 yarn 工作区中共享组件(next 和 tailwindcss)
- mongodb - 使用高级查找时有什么改进缓慢的 mongodb 查询的策略?
- python - Python中的正则表达式符号
- outlook - 如何向未在电子邮件标头中列出的收件人发送电子邮件(使用 EWS 或 office-js,或者可能使用 MS 堆栈模拟 SMTP)?
- postgresql - Intellij SSH 到远程数据库
- c - 全局函数未返回正确的值
- c++ - 为什么我不能在这个向量上使用 push_back?
- selenium - 搜索字段在远程(专家)chorme v91 中不起作用