代码之家  ›  专栏  ›  技术社区  ›  Thufir

使用javax.xml.transform.transformer

  •  1
  • Thufir  · 技术社区  · 6 年前

    我不明白 StreamResult 实例。我明白了 Transformer 对象接收 source streamResult :

        transformer.transform(source, streamResult);
    

    这种变换 来源 进入之内 流线结果 ?奇怪的是,这里面什么也没有 operation 然而 流线结果 由于缺少更好的词汇,现在有了数据。它是 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 回复  |  直到 6 年前
        1
  •  2
  •   Justin Albano    6 年前

    所讨论的行接受一个XML源和另一个对象(即 Result )转换结果可以写入的位置。实际上,第二个参数是您提供的一个桶,它允许 transform 方法放置其结果。一旦方法调用结束,您将检索您的bucket并从中提取结果。

    在您的特定情况下:

    transformer.transform(source, streamResult);
    

    这个 streamResult 对象是一个流式写入程序,它封装了 StringWriter . 这个 流线结果 然后将对象传递给 转型 方法,将其结果写入 StreamResult ,然后将结果写入 架线作家 . 然后你可以打电话给 toString 方法在 架线作家 查看转换的字符串化结果。

    回答你的第二个问题:有些方法不会因为效率和灵活性而返回结果。例如,假设执行了大量的转换。如果返回结果,则需要为每个转换创建一个新对象。如果传入结果对象(称为 输出参数 )可以反复使用相同的结果对象。其次,返回结果会消除一些灵活性,因为它不允许用户指定 怎样 结果应该写下来。在你的情况下,你可以通过 架线作家 包裹在一个 流线结果 ,但您也可以轻松地传入任何实现 结果 接口。

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