используя javax.xml.transform.Transformer - PullRequest
0 голосов
/ 04 января 2019

Я не понимаю, что происходит с экземпляром 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. 

Не будет ли более интуитивно понятным вернуть результат?

1 Ответ

0 голосов
/ 04 января 2019

Строка, о которой идет речь, получает источник XML и другой объект (т.е. Result), в который могут быть записаны результаты преобразования. По сути, второй аргумент - это предоставленная вами корзина, которая позволяет методу transform разместить результаты. После завершения вызова метода вы извлекаете свое ведро и извлекаете из него результаты.

В вашем конкретном случае:

transformer.transform(source, streamResult);

Объект streamResult является потоковым писателем, который инкапсулирует StringWriter. Этот объект streamResult затем передается методу transform, который записывает свои результаты в StreamResult, который, в свою очередь, записывает результаты в StringWriter. Затем вы можете вызвать метод toString для StringWriter, чтобы просмотреть строковые результаты преобразования.

Чтобы ответить на ваш второй вопрос: некоторые методы не возвращают свои результаты из-за эффективности и гибкости. Например, предположим, что выполняется очень большое количество преобразований. Если результаты будут возвращены, для каждого из этих преобразований потребуется создать новый объект. В случае, когда объект результата передается (называемый параметром out ), один и тот же объект результата может многократно использоваться снова и снова. Во-вторых, возврат результата устраняет некоторую гибкость, поскольку он не позволяет пользователю указать как результаты должны быть записаны. В вашем случае вы могли передать StringWriter, заключенный в StreamResult, но вы также легко могли передать любой объект, который реализует интерфейс Result.

Существуют некоторые альтернативы этому типу параметра out, использующие лямбда-выражения и функциональное программирование, но в то время, когда был написан интерфейс преобразования XML, параметры out были обычной практикой (а в некоторых случаях все еще остаются).

...