Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javax.xml.transform.Transformer_Java_Xml_Xslt_Saxon - Fatal编程技术网

使用javax.xml.transform.Transformer

使用javax.xml.transform.Transformer,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,我不理解StreamResult实例会发生什么。我看到Transformer对象接收source和streamResult: transformer.transform(source, streamResult); 这将源代码转换为流结果?奇怪的是,由于缺少更好的词汇,streamResult现在没有返回任何数据。它是xml数据吗 package helloWorldSaxon; import java.io.IOException; import java.io.StringWri

我不理解
StreamResult
实例会发生什么。我看到
Transformer
对象接收
source
streamResult

    transformer.transform(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源和另一个对象(即
结果
),可以在其中写入转换结果。本质上,第二个参数是您提供的一个bucket,它允许
transform
方法放置其结果。方法调用结束后,检索bucket并从中取出结果

在您的特殊情况下:

transformer.transform(source, streamResult);
streamResult
对象是一个流式编写器,它封装了
StringWriter
。然后将此
streamResult
对象传递给
transform
方法,该方法将其结果写入
streamResult
,后者将结果写入
StringWriter
。然后可以调用
StringWriter
上的
toString
方法来查看转换的字符串化结果

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


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

还有一段时间,但我认为您已经在其中找到了它。我欣赏术语和上下文。更有意义。我猜最初动机的一部分可能是StreamResult可以将数据导入HTTP响应,这可能允许浏览器在转换完成之前开始显示结果。@MichaelKay True,这将是一个很好的用例。流和函数接口可以用一个可以链接的返回值(使用JDK 8+)来代替这一点,但在此之前,没有很多简单的方法可以做到这一点。我建议我们集中精力让代码正常工作,尽量避免讨论JAXP是否可以设计得更好。是的,它可以,但这不会帮助你前进。(不管怎么说,它超出了StackOverflow的范围)。