有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用javax。xml。使改变变压器

我不明白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. 

返回结果不是更直观吗


共 (1) 个答案

  1. # 1 楼答案

    这行代码包含一个XML源和另一个对象(即Result),可以在其中写入转换结果。本质上,第二个参数是您提供的一个bucket,它允许transform方法放置其结果。方法调用结束后,检索bucket并从中取出结果

    在你的特殊情况下:

    transformer.transform(source, streamResult);
    

    streamResult对象是一个流式写入程序,它封装了StringWriter。然后,这个streamResult对象被传递给transform方法,该方法将其结果写入StreamResult,后者反过来将结果写入StringWriter。然后可以调用StringWriter上的toString方法来查看转换的字符串化结果

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

    使用lambda表达式和函数编程可以替代这种类型的out参数,但在编写XML转换接口时,out参数是一种常见做法(在某些情况下,仍然是)