Рубрики
Без рубрики

Как написать XML–файл на Java – (DOM-анализатор)

Примеры синтаксического анализатора DOM для записи XML-элементов, атрибутов, комментариев, CDATA в файл.

В этом руководстве показано, как использовать встроенные API Java DOM для записи данных в XML-файл.

Содержание

  • 1. Запись XML в файл
  • 2. Симпатичный печатный XML
  • 3. Запись XML-элементов, атрибутов, комментариев CDATA и т.Д
  • 4. Часто задаваемые вопросы по DOM
    • 4.1 Как отключить объявление XML?
    • 4.2 Как изменить кодировку XML?
    • 4.3 Как красиво распечатать XML-файл?
    • 4.4 Как скрыть XML-декларацию?
    • 4.5 Как изменить версию XML-декларации?
  • 5. Скачать Исходный Код
  • 6. Рекомендации

P.S Протестировано с Java 11

Прочтите это Как читать XML–файл на Java – (DOM-анализатор)

1. Запись XML в файл

Шаги по созданию и записи XML в файл.

  1. Создайте Документ doc .
  2. Создайте XML-элементы, атрибуты и т.д. и добавьте их в Документ doc .
  3. Создайте Трансформатор для записи Документа doc в Выходной поток .
package com.mkyong.xml.dom;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.OutputStream;

public class WriteXmlDom1 {

    public static void main(String[] args)
            throws ParserConfigurationException, TransformerException {

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

        // root elements
        Document doc = docBuilder.newDocument();
        Element rootElement = doc.createElement("company");
        doc.appendChild(rootElement);

        doc.createElement("staff");
        rootElement.appendChild(doc.createElement("staff"));

        //...create XML elements, and others...

        // write dom document to a file
        try (FileOutputStream output =
                     new FileOutputStream("c:\\test\\staff-dom.xml")) {
            writeXml(doc, output);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    // write doc to output stream
    private static void writeXml(Document doc,
                                 OutputStream output)
            throws TransformerException {

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(output);

        transformer.transform(source, result);

    }
}

Выход

mkyong

2. Симпатичный печатный XML

2.1 По умолчанию Трансформатор выводит XML в компактном формате.

mkyong

2.2 Мы можем установить Клавиши вывода. ОТСТУП в Трансформатор для включения красивого формата печати.

  TransformerFactory transformerFactory = TransformerFactory.newInstance();
  Transformer transformer = transformerFactory.newTransformer();

  // pretty print XML
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");

  DOMSource source = new DOMSource(doc);
  StreamResult result = new StreamResult(output);

  transformer.transform(source, result);

Выход



  mkyong

3. Запись XML-элементов, атрибутов, комментариев CDATA и т.Д

В приведенном ниже примере используется анализатор DOM для создания и записи XML в Поток вывода .

package com.mkyong.xml.dom;

import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class WriteXmlDom3 {

  public static void main(String[] args)
          throws ParserConfigurationException, TransformerException {

      DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

      // root elements
      Document doc = docBuilder.newDocument();
      Element rootElement = doc.createElement("company");
      doc.appendChild(rootElement);

      // staff 1001

      // add xml elements
      Element staff = doc.createElement("staff");
      // add staff to root
      rootElement.appendChild(staff);
      // add xml attribute
      staff.setAttribute("id", "1001");

      // alternative
      // Attr attr = doc.createAttribute("id");
      // attr.setValue("1001");
      // staff.setAttributeNode(attr);

      Element name = doc.createElement("name");
      // JDK 1.4
      //name.appendChild(doc.createTextNode("mkyong"));
      // JDK 1.5
      name.setTextContent("mkyong");
      staff.appendChild(name);

      Element role = doc.createElement("role");
      role.setTextContent("support");
      staff.appendChild(role);

      Element salary = doc.createElement("salary");
      salary.setAttribute("currency", "USD");
      salary.setTextContent("5000");
      staff.appendChild(salary);

      // add xml comment
      Comment comment = doc.createComment(
              "for special characters like < &, need CDATA");
      staff.appendChild(comment);

      Element bio = doc.createElement("bio");
      // add xml CDATA
      CDATASection cdataSection =
              doc.createCDATASection("HTML tag testing");
      bio.appendChild(cdataSection);
      staff.appendChild(bio);

      // staff 1002
      Element staff2 = doc.createElement("staff");
      // add staff to root
      rootElement.appendChild(staff2);
      staff2.setAttribute("id", "1002");

      Element name2 = doc.createElement("name");
      name2.setTextContent("yflow");
      staff2.appendChild(name2);

      Element role2 = doc.createElement("role");
      role2.setTextContent("admin");
      staff2.appendChild(role2);

      Element salary2 = doc.createElement("salary");
      salary2.setAttribute("currency", "EUD");
      salary2.setTextContent("8000");
      staff2.appendChild(salary2);

      Element bio2 = doc.createElement("bio");
      // add xml CDATA
      bio2.appendChild(doc.createCDATASection("a & b"));
      staff2.appendChild(bio2);

      // print XML to system console
      writeXml(doc, System.out);

  }

  // write doc to output stream
  private static void writeXml(Document doc,
                               OutputStream output)
          throws TransformerException {

      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();

      // pretty print
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");

      DOMSource source = new DOMSource(doc);
      StreamResult result = new StreamResult(output);

      transformer.transform(source, result);

  }
}

Выход



  
      mkyong
      support
      5000
      
      
          
  
  
      yflow
      admin
      8000
      
          
  

4. Часто задаваемые вопросы по DOM

Некоторые парсеры DOM часто задавали вопросы.

4.1 Как отключить объявление XML?

Мы можем настроить Клавиши вывода. ОПУЩЕН_XML_DECLARATION для отображения XML-объявления.

  // hide the xml declaration
  // hide 
  transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

4.2 Как изменить кодировку XML?

Мы можем настроить Клавиши вывода. КОДИРОВКА для изменения кодировки XML.

  // set xml encoding
  // 
  transformer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");

4.3 Как красиво распечатать XML-файл?

Мы можем настроить Клавиши вывода. ОТСТУП , чтобы включить красивую печать XML.

  // pretty print
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");

4.4 Как скрыть XML-декларацию`?

Мы можем настроить document.setxmlstandalone(true) , чтобы скрыть объявление XML автономный="нет" .

  TransformerFactory transformerFactory = TransformerFactory.newInstance();
  Transformer transformer = transformerFactory.newTransformer();

  // pretty print
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");

  // hide the standalone="no"
  doc.setXmlStandalone(true);

  DOMSource source = new DOMSource(doc);
  StreamResult result = new StreamResult(output);

  transformer.transform(source, result);

4.5 Как изменить версию XML-декларации?

Мы можем настроить document.setxmlversion("версия") для изменения версии XML-декларации.

  // set xml version
  // 
  doc.setXmlVersion("1.1");

5. Скачать Исходный Код

$клон git $клон git

$компакт-диск java-xml

$cd src/основной/java/com/mkyong/xml/дом/

6. Рекомендации

Оригинал: “https://mkyong.com/java/how-to-create-xml-file-in-java-dom/”