使用 javax.xml.transform.Transformer
using javax.xml.transform.Transformer
我不明白 StreamResult
实例发生了什么。我看到 Transformer
对象收到 source
和 streamResult
:
transformer.transform(source, streamResult);
这会将 source
转换为 streamResult
? operation 中没有任何内容 return 似乎很奇怪,但 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.
return一个结果不是更直观吗?
有问题的行接受一个 XML 源和另一个对象(即 Result
),其中可以写入转换结果。本质上,第二个参数是您提供的一个桶,它允许 transform
方法放置其结果。方法调用结束后,您检索存储桶并从中取出结果。
在您的特定情况下:
transformer.transform(source, streamResult);
streamResult
对象是一个封装了 StringWriter
的流式写入器。然后将此 streamResult
对象传递给 transform
方法,该方法将其结果写入 StreamResult
,后者又将结果写入 StringWriter
。然后,您可以在 StringWriter
上调用 toString
方法来查看转换的字符串化结果。
回答你的第二个问题:一些方法不 return 它们的结果是效率和灵活性的问题。例如,假设执行了非常大量的转换。如果结果是 returned,则需要为这些转换中的每一个创建一个新对象。在传入结果对象的情况下(称为 out 参数 ),可以反复使用相同的结果对象。其次,returning 结果消除了一些灵活性,因为它不允许用户指定如何 结果应该被写入。在你的例子中,你可以传递一个包裹在 StreamResult
中的 StringWriter
,但你也可以很容易地传递任何实现 Result
接口的对象。
有一些使用 lambda 表达式和函数式编程来替代这种类型的输出参数,但是在编写 XML 转换接口时,输出参数是一种常见的做法(在某些情况下,仍然是).
我不明白 StreamResult
实例发生了什么。我看到 Transformer
对象收到 source
和 streamResult
:
transformer.transform(source, streamResult);
这会将 source
转换为 streamResult
? operation 中没有任何内容 return 似乎很奇怪,但 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.
return一个结果不是更直观吗?
有问题的行接受一个 XML 源和另一个对象(即 Result
),其中可以写入转换结果。本质上,第二个参数是您提供的一个桶,它允许 transform
方法放置其结果。方法调用结束后,您检索存储桶并从中取出结果。
在您的特定情况下:
transformer.transform(source, streamResult);
streamResult
对象是一个封装了 StringWriter
的流式写入器。然后将此 streamResult
对象传递给 transform
方法,该方法将其结果写入 StreamResult
,后者又将结果写入 StringWriter
。然后,您可以在 StringWriter
上调用 toString
方法来查看转换的字符串化结果。
回答你的第二个问题:一些方法不 return 它们的结果是效率和灵活性的问题。例如,假设执行了非常大量的转换。如果结果是 returned,则需要为这些转换中的每一个创建一个新对象。在传入结果对象的情况下(称为 out 参数 ),可以反复使用相同的结果对象。其次,returning 结果消除了一些灵活性,因为它不允许用户指定如何 结果应该被写入。在你的例子中,你可以传递一个包裹在 StreamResult
中的 StringWriter
,但你也可以很容易地传递任何实现 Result
接口的对象。
有一些使用 lambda 表达式和函数式编程来替代这种类型的输出参数,但是在编写 XML 转换接口时,输出参数是一种常见的做法(在某些情况下,仍然是).