Запись DOM в виде XML-файла - PullRequest
       22

Запись DOM в виде XML-файла

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

Прямо от Руководство:

Запись DOM в виде файла XML

После того, как вы сконструировали DOM (путем анализа файла XML или строить его программно) вы часто хотите сохранить его в формате XML. В этом разделе показано, как это сделать с помощью преобразования Xalan. пакет.

Используя этот пакет, вы создадите объект-трансформер для подключения DOMSource для StreamResult. Затем вы будете вызывать трансформатор метод transform () для записи DOM в виде данных XML.

мой вывод:

thufir@dur:~/NetBeansProjects/helloWorldSaxon$ 
thufir@dur:~/NetBeansProjects/helloWorldSaxon$ gradle clean run

> Task :run
Jan 04, 2019 3:28:24 PM helloWorldSaxon.HandlerForXML createDocumentFromURL
INFO: http://books.toscrape.com/
Jan 04, 2019 3:28:26 PM helloWorldSaxon.HandlerForXML createDocumentFromURL
INFO: javax.xml.transform.dom.DOMResult@3cda1055
Jan 04, 2019 3:28:26 PM helloWorldSaxon.HandlerForXML createDocumentFromURL
INFO: html

BUILD SUCCESSFUL in 2s
4 actionable tasks: 4 executed
thufir@dur:~/NetBeansProjects/helloWorldSaxon$ 

Во-первых, я хотел бы получить более значимый вывод о том, что domResult выглядит, выглядит или содержит. Я считаю, что более важным является итерация или обход document ниже:

    public void createDocumentFromURL() throws SAXException, IOException, TransformerException, ParserConfigurationException {
        LOG.info(url.toString());

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.ccil.cowan.tagsoup.Parser");
        Source source = new SAXSource(xmlReader, new InputSource(url.toString()));

        DOMResult domResult = new DOMResult();

        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(source, domResult);  //how do I find the result of this operation?

        LOG.info(domResult.toString());  //traverse or iterate how?

        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//        Document document = documentBuilder.parse();   ///bzzzt, wrong

        Document document = (Document) domResult.getNode();

        LOG.info(document.getDocumentElement().getTagName());
        }

То, что вывод "html" склоняет меня к мысли, что это html. Желаемый вывод - это html, но из Document, а не String.

Документация Oracle по написанию DOM предназначена для разбора документа. Этот документ еще не проанализирован? Или, другими словами, как мне установить, что это или не файл XML вообще?

Итак ... преобразуйте его снова ?

см. Также:

Java: преобразование StreamResult в DOM

1 Ответ

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

Вам действительно нужно преобразовать DOM в ваш файл.

* ** 1003 тысяча два * Пример
// Create DOM
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = document.createElement("Root");
document.appendChild(root);
Element foo = document.createElement("Foo");
foo.appendChild(document.createTextNode("Bar"));
root.appendChild(foo);

Вы можете сохранить этот DOM в файл, подобный следующему:

// Write DOM to file as XML
File xmlFile = new File("/path/to/file.xml");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(xmlFile));

Вы также можете просто напечатать DOM следующим образом:

// Print DOM as XML
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(System.out));

выход

<?xml version="1.0" encoding="UTF-8" standalone="no"?><Root><Foo>Bar</Foo></Root>

Если вы хотите отформатировать XML:

// Print DOM as formatted XML
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(System.out));

выход

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root>
    <Foo>Bar</Foo>
</Root>
...