Вопрос-ответ

How to read and write XML files?

Как читать и записывать XML-файлы?

Я должен читать и записывать в XML файл и из него. Какой самый простой способ читать и записывать XML-файлы с помощью Java?

Переведено автоматически
Ответ 1

Вот краткий пример DOM, который показывает, как читать и записывать простой XML-файл с его dtd:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE roles SYSTEM "roles.dtd">
<roles>
<role1>User</role1>
<role2>Author</role2>
<role3>Admin</role3>
<role4/>
</roles>

и dtd:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT roles (role1,role2,role3,role4)>
<!ELEMENT role1 (#PCDATA)>
<!ELEMENT role2 (#PCDATA)>
<!ELEMENT role3 (#PCDATA)>
<!ELEMENT role4 (#PCDATA)>

Сначала импортируйте эти:

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.*;
import org.w3c.dom.*;

Вот несколько переменных, которые вам понадобятся:

private String role1 = null;
private String role2 = null;
private String role3 = null;
private String role4 = null;
private ArrayList<String> rolev;

Вот программа для чтения (String xml - это имя вашего XML-файла):

public boolean readXML(String xml) {
rolev = new ArrayList<String>();
Document dom;
// Make an instance of the DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// use the factory to take an instance of the document builder
DocumentBuilder db = dbf.newDocumentBuilder();
// parse using the builder to get the DOM mapping of the
// XML file
dom = db.parse(xml);

Element doc = dom.getDocumentElement();

role1 = getTextValue(role1, doc, "role1");
if (role1 != null) {
if (!role1.isEmpty())
rolev.add(role1);
}
role2 = getTextValue(role2, doc, "role2");
if (role2 != null) {
if (!role2.isEmpty())
rolev.add(role2);
}
role3 = getTextValue(role3, doc, "role3");
if (role3 != null) {
if (!role3.isEmpty())
rolev.add(role3);
}
role4 = getTextValue(role4, doc, "role4");
if ( role4 != null) {
if (!role4.isEmpty())
rolev.add(role4);
}
return true;

} catch (ParserConfigurationException pce) {
System.out.println(pce.getMessage());
} catch (SAXException se) {
System.out.println(se.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}

return false;
}

И здесь писатель:

public void saveToXML(String xml) {
Document dom;
Element e = null;

// instance of a DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// use factory to get an instance of document builder
DocumentBuilder db = dbf.newDocumentBuilder();
// create instance of DOM
dom = db.newDocument();

// create the root element
Element rootEle = dom.createElement("roles");

// create data elements and place them under root
e = dom.createElement("role1");
e.appendChild(dom.createTextNode(role1));
rootEle.appendChild(e);

e = dom.createElement("role2");
e.appendChild(dom.createTextNode(role2));
rootEle.appendChild(e);

e = dom.createElement("role3");
e.appendChild(dom.createTextNode(role3));
rootEle.appendChild(e);

e = dom.createElement("role4");
e.appendChild(dom.createTextNode(role4));
rootEle.appendChild(e);

dom.appendChild(rootEle);

try {
Transformer tr = TransformerFactory.newInstance().newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.setOutputProperty(OutputKeys.METHOD, "xml");
tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "roles.dtd");
tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

// send DOM to file
tr.transform(new DOMSource(dom),
new StreamResult(new FileOutputStream(xml)));

} catch (TransformerException te) {
System.out.println(te.getMessage());
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
} catch (ParserConfigurationException pce) {
System.out.println("UsersXML: Error trying to instantiate DocumentBuilder " + pce);
}
}

getTextValue находится здесь:

private String getTextValue(String def, Element doc, String tag) {
String value = def;
NodeList nl;
nl = doc.getElementsByTagName(tag);
if (nl.getLength() > 0 && nl.item(0).hasChildNodes()) {
value = nl.item(0).getFirstChild().getNodeValue();
}
return value;
}

Добавьте несколько средств доступа и мутаторов, и готово!

Ответ 2

Написание XML с использованием JAXB (Java Architecture for XML Binding):

http://www.mkyong.com/java/jaxb-hello-world-example/

package com.mkyong.core;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

String name;
int age;
int id;

public String getName() {
return name;
}

@XmlElement
public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

@XmlElement
public void setAge(int age) {
this.age = age;
}

public int getId() {
return id;
}

@XmlAttribute
public void setId(int id) {
this.id = id;
}

}

package com.mkyong.core;

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class JAXBExample {
public static void main(String[] args) {

Customer customer = new Customer();
customer.setId(100);
customer.setName("mkyong");
customer.setAge(29);

try {

File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);

} catch (JAXBException e) {
e.printStackTrace();
}

}
}
Ответ 3

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

SAX parser выполняет обратный вызов некоторых функций, когда находит начало элемента, конец элемента, атрибут, текст между элементами и т.д., Поэтому он может проанализировать документ, и в то же время вы получите то, что вам нужно.

Несколько примеров кода:

http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

Ответ 4

Ответы касаются только DOM / SAX и реализации copy paste примера JAXB.

Однако при использовании XML отсутствует одна большая область. Во многих проектах / программах необходимо сохранять / извлекать некоторые базовые структуры данных. В вашей программе уже есть классы для ваших красивых и блестящих бизнес-объектов / структур данных, вам просто нужен удобный способ преобразования этих данных в XML-структуру, чтобы вы могли творить с ними больше волшебства (хранить, загружать, отправлять, манипулировать с помощью XSLT).

Вот где XStream блистает. Вы просто аннотируете классы, содержащие ваши данные, или, если вы не хотите изменять эти классы, вы настраиваете экземпляр XStream для маршалинга (objects -> xml) или демаршалинга (xml -> objects).

Внутренне XStream использует reflection, методы readObject и readResolve стандартной сериализации объектов Java.

Вы получите хорошее и быстрое руководство здесь:

Чтобы дать краткий обзор того, как это работает, я также привожу несколько примеров кода, который маршалирует и разархивирует структуру данных. Маршалинг / демаршалинг происходит полностью в main методе, остальное - это просто код для генерации некоторых тестовых объектов и заполнения в них некоторых данных. Настроить xStream экземпляр очень просто, а маршалинг / разархивирование выполняется с помощью одной строки кода каждая.

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;

public class XStreamIsGreat {

public static void main(String[] args) {
XStream xStream = new XStream();
xStream.alias("good", Good.class);
xStream.alias("pRoDuCeR", Producer.class);
xStream.alias("customer", Customer.class);

Producer a = new Producer("Apple");
Producer s = new Producer("Samsung");
Customer c = new Customer("Someone").add(new Good("S4", 10, new BigDecimal(600), s))
.add(new Good("S4 mini", 5, new BigDecimal(450), s)).add(new Good("I5S", 3, new BigDecimal(875), a));
String xml = xStream.toXML(c); // objects -> xml
System.out.println("Marshalled:\n" + xml);
Customer unmarshalledCustomer = (Customer)xStream.fromXML(xml); // xml -> objects
}

static class Good {
Producer producer;

String name;

int quantity;

BigDecimal price;

Good(String name, int quantity, BigDecimal price, Producer p) {
this.producer = p;
this.name = name;
this.quantity = quantity;
this.price = price;
}

}

static class Producer {
String name;

public Producer(String name) {
this.name = name;
}
}

static class Customer {
String name;

public Customer(String name) {
this.name = name;
}

List<Good> stock = new ArrayList<Good>();

Customer add(Good g) {
stock.add(g);
return this;
}
}
}
java xml