XML теперь стал универсальным форматом обмена данными. Его независимость от платформы, языка и системы обеспечивает большое удобство интеграции и взаимодействия данных. Для грамматических знаний и технических подробностей самого XML вам необходимо прочитать соответствующую техническую литературу, которая включает в себя DOM (объектная модель документа), DTD (определение типа документа), SAX (простой API для XML), XSD (определение схемы XML)). , XSLT (преобразования расширяемого языка таблиц стилей), для получения дополнительной информации обратитесь к документу официального сайта w3c http://www.w3.org.
XML анализируется одинаково на разных языках, но реализованный синтаксис различен. Существует два основных метода синтаксического анализа: один называется SAX, а другой — DOM. SAX основан на анализе потока событий, а DOM — на анализе древовидной структуры XML-документа. Предположим, что содержимое и структура нашего XML следующие:
Скопируйте код кода следующим образом:
<?xml version="1.0"coding="UTF-8"?>
<сотрудники>
<сотрудник>
<name>ddviplinux</name>
<sex>м</sex>
<возраст>30</возраст>
</сотрудник>
</сотрудники>
В этой статье используется язык JAVA для реализации генерации XML-документов и анализа DOM и SAX.
Сначала определите интерфейс для работы с XML-документами, XmlDocument. Он определяет интерфейс для создания и анализа XML-документов.
Скопируйте код кода следующим образом:
пакет com.alisoft.facepay.framework.bean;
/**
*
* @author hongliang.dinghl
* Определить интерфейс для создания и анализа XML-документов.
*/
общедоступный интерфейс XmlDocument {
/**
* Создать XML-документ
* @param fileName Полный путь к файлу
*/
public void createXml (String fileName);
/**
* Разбор XML-документов.
* @param fileName Полный путь к файлу
*/
public void parserXml (String fileName);
}
1.DOM генерирует и анализирует XML-документы.
Для анализируемой версии XML-документа определен набор интерфейсов. Анализатор считывает весь документ и создает резидентную древовидную структуру, которой код может затем манипулировать с помощью интерфейса DOM. Преимущества: все дерево документов находится в памяти, с ним легко работать; поддерживает множество функций, таких как удаление, изменение и переупорядочение. Недостатки: перенос всего документа в память (включая бесполезные узлы) приводит к потере времени и места. Случаи использования: после анализа документов; также необходимо несколько раз обращаться к этим данным; аппаратных ресурсов достаточно (память, процессор).
Скопируйте код кода следующим образом:
пакет com.alisoft.facepay.framework.bean;
импортировать java.io.FileInputStream;
импортировать java.io.FileNotFoundException;
импортировать java.io.FileOutputStream;
импортировать java.io.IOException;
импортировать java.io.InputStream;
импортировать java.io.PrintWriter;
импортировать javax.xml.parsers.DocumentBuilder;
импортировать javax.xml.parsers.DocumentBuilderFactory;
импортировать javax.xml.parsers.ParserConfigurationException;
импортировать javax.xml.transform.OutputKeys;
импортировать javax.xml.transform.Transformer;
импортировать javax.xml.transform.TransformerConfigurationException;
импортировать javax.xml.transform.TransformerException;
импортировать javax.xml.transform.TransformerFactory;
импортировать javax.xml.transform.dom.DOMSource;
импортировать javax.xml.transform.stream.StreamResult;
импортировать org.w3c.dom.Document;
импортировать org.w3c.dom.Element;
импортировать org.w3c.dom.Node;
импортировать org.w3c.dom.NodeList;
импортировать org.xml.sax.SAXException;
/**
*
* @author hongliang.dinghl
* Генерация DOM и анализ XML-документов.
*/
публичный класс DomDemo реализует XmlDocument {
документ частного документа;
частная строка имя_файла;
общественная недействительная инициализация () {
пытаться {
Фабрика DocumentBuilderFactory = DocumentBuilderFactory
.новыйэкземпляр();
Конструктор DocumentBuilder = Factory.newDocumentBuilder();
this.document = builder.newDocument();
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
}
}
public void createXml (String fileName) {
Корень элемента = this.document.createElement("сотрудники");
this.document.appendChild(корень);
Элемент сотрудник = this.document.createElement("сотрудник");
Имя элемента = this.document.createElement("name");
name.appendChild(this.document.createTextNode("Дин Хунлян"));
сотрудник.appendChild(имя);
Пол элемента = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("m"));
сотрудник.appendChild(пол);
Возраст элемента = this.document.createElement("возраст");
age.appendChild(this.document.createTextNode("30"));
сотрудник.appendChild(возраст);
root.appendChild(сотрудник);
TransformerFactory tf = TransformerFactory.newInstance();
пытаться {
Трансформатор-трансформер = tf.newTransformer();
Источник DOMSource = новый DOMSource (документ);
Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
Transformer.setOutputProperty(OutputKeys.INDENT, «да»);
PrintWriter pw = новый PrintWriter (новый FileOutputStream (имя файла));
Результат StreamResult = новый StreamResult(pw);
Transformer.transform(источник, результат);
System.out.println("XML-файл успешно создан!");
} catch (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (TransformerException e) {
System.out.println(e.getMessage());
}
}
public void parserXml (String fileName) {
пытаться {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Документ document = db.parse(fileName);
Сотрудники NodeList = document.getChildNodes();
for (int i = 0; i < jobs.getLength(); i++) {
Сотрудник узла = сотрудники.item(i);
NodeList сотрудникИнфо = сотрудник.getChildNodes();
for (int j = 0; j <employeeInfo.getLength(); j++) {
Узел node = сотрудникInfo.item(j);
NodeList сотрудникМета = node.getChildNodes();
for (int k = 0; k <employeeMeta.getLength(); k++) {
System.out.println(employeeMeta.item(k).getNodeName()
+ ":" + сотрудниковMeta.item(k).getTextContent());
}
}
}
System.out.println("Разбор завершен");
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
} catch (SAXException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
2.SAX генерирует и анализирует XML-документы.
Для решения проблемы DOM появился SAX. SAX, управляемый событиями. Когда парсер находит начало элемента, конец элемента, начало или конец текста, документа и т. д., он отправляет события, а программисты пишут код, который реагирует на эти события и сохраняет данные. Преимущества: нет необходимости загружать весь документ заранее, он занимает меньше ресурсов; код парсера SAX меньше кода парсера DOM и подходит для апплета и загрузки. Недостатки: не сохраняется; после события, если данные не сохраняются, данные теряются; из события можно получить только текст, но неизвестно, к какому элементу принадлежит текст; XML-документ Небольшой объем содержимого, редко используемый для повторного использования; небольшой объем машинной памяти;
Java-код
Скопируйте код кода следующим образом:
пакет com.alisoft.facepay.framework.bean;
импортировать java.io.FileInputStream;
импортировать java.io.FileNotFoundException;
импортировать java.io.IOException;
импортировать java.io.InputStream;
импортировать javax.xml.parsers.ParserConfigurationException;
импортировать javax.xml.parsers.SAXParser;
импортировать javax.xml.parsers.SAXParserFactory;
импортировать org.xml.sax.Attributes;
импортировать org.xml.sax.SAXException;
импортировать org.xml.sax.helpers.DefaultHandler;
/**
*
* @author hongliang.dinghl
* Анализ документов SAX
*/
публичный класс SaxDemo реализует XmlDocument {
public void createXml (String fileName) {
System.out.println("<<"+имя_файла+">>");
}
public void parserXml (String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
пытаться {
SAXParser saxparser = saxfac.newSAXParser();
InputStream = новый FileInputStream(fileName);
saxparser.parse(есть, новый MySAXHandler());
} catch (ParserConfigurationException e) {
е.printStackTrace();
} catch (SAXException e) {
е.printStackTrace();
} catch (FileNotFoundException e) {
е.printStackTrace();
} catch (IOException e) {
е.printStackTrace();
}
}
}
класс MySAXHandler расширяет DefaultHandler {
логическое значение hasAttribute = ложь;
Атрибуты атрибуты = ноль;
public void startDocument() выдает исключение SAXException {
System.out.println("Документ начал печать");
}
public void endDocument() выдает SAXException {
System.out.println("Печать документа завершена");
}
public void startElement (String uri, String localName, String qName,
Атрибуты атрибутов) выдает SAXException {
if (qName.equals("сотрудники")) {
возвращаться;
}
if (qName.equals("сотрудник")) {
System.out.println(qName);
}
если (attributes.getLength() > 0) {
this.attributes = атрибуты;
this.hasAttribute = правда;
}
}
public void endElement (String uri, String localName, String qName)
выдает SAXException {
if (hasAttribute && (атрибуты!= null)) {
for (int i = 0; i <attributes.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ атрибуты.getValue(0));
}
}
}
публичные недействительные символы (char[] ch, int start, int length)
выдает SAXException {
System.out.println(новая строка(ch, начало, длина));
}
}
пакет com.alisoft.facepay.framework.bean;
импортировать java.io.FileInputStream;
импортировать java.io.FileNotFoundException;
импортировать java.io.IOException;
импортировать java.io.InputStream;
импортировать javax.xml.parsers.ParserConfigurationException;
импортировать javax.xml.parsers.SAXParser;
импортировать javax.xml.parsers.SAXParserFactory;
импортировать org.xml.sax.Attributes;
импортировать org.xml.sax.SAXException;
импортировать org.xml.sax.helpers.DefaultHandler;
/**
*
* @author hongliang.dinghl
* Анализ документов SAX
*/
публичный класс SaxDemo реализует XmlDocument {
public void createXml (String fileName) {
System.out.println("<<"+имя_файла+">>");
}
public void parserXml (String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
пытаться {
SAXParser saxparser = saxfac.newSAXParser();
InputStream = новый FileInputStream(fileName);
saxparser.parse(есть, новый MySAXHandler());
} catch (ParserConfigurationException e) {
е.printStackTrace();
} catch (SAXException e) {
е.printStackTrace();
} catch (FileNotFoundException e) {
е.printStackTrace();
} catch (IOException e) {
е.printStackTrace();
}
}
}
класс MySAXHandler расширяет DefaultHandler {
логическое значение hasAttribute = ложь;
Атрибуты атрибуты = ноль;
public void startDocument() выдает исключение SAXException {
System.out.println("Документ начал печать");
}
public void endDocument() выдает исключение SAXException {
System.out.println("Печать документа завершена");
}
public void startElement (String uri, String localName, String qName,
Атрибуты атрибутов) выдает SAXException {
if (qName.equals("сотрудники")) {
возвращаться;
}
if (qName.equals("сотрудник")) {
System.out.println(qName);
}
если (attributes.getLength() > 0) {
this.attributes = атрибуты;
this.hasAttribute = правда;
}
}
public void endElement (String uri, String localName, String qName)
выдает SAXException {
if (hasAttribute && (атрибуты!= null)) {
for (int i = 0; i <attributes.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ атрибуты.getValue(0));
}
}
}
публичные недействительные символы (char[] ch, int start, int length)
выдает SAXException {
System.out.println(новая строка(ch, начало, длина));
}
}
3.DOM4J генерирует и анализирует XML-документы.
DOM4J — это очень, очень превосходный Java XML API с отличной производительностью, мощными функциями и чрезвычайной простотой использования. Это также программное обеспечение с открытым исходным кодом. В настоящее время вы можете видеть, что все больше и больше программного обеспечения Java используют DOM4J для чтения и записи XML. Особо стоит отметить, что даже JAXM от Sun также использует DOM4J.
Java-код
Скопируйте код кода следующим образом:
пакет com.alisoft.facepay.framework.bean;
импортировать java.io.File;
импортировать java.io.FileWriter;
импортировать java.io.IOException;
импортировать java.io.Writer;
импортировать java.util.Iterator;
импортировать org.dom4j.Document;
импортировать org.dom4j.DocumentException;
импортировать org.dom4j.DocumentHelper;
импортировать org.dom4j.Element;
импортировать org.dom4j.io.SAXReader;
импортировать org.dom4j.io.XMLWriter;
/**
*
* @author hongliang.dinghl
* Dom4j генерирует XML-документы и анализирует XML-документы.
*/
публичный класс Dom4jDemo реализует XmlDocument {
public void createXml (String fileName) {
Документ документ = DocumentHelper.createDocument();
Элемент сотрудники=document.addElement("сотрудники");
Элемент сотрудник=employees.addElement("сотрудник");
Имя элемента = сотрудник.addElement("имя");
name.setText("ddvip");
Элемент sex=employee.addElement("sex");
sex.setText("м");
Элемент age=employee.addElement("возраст");
age.setText("29");
пытаться {
Писатель fileWriter = новый FileWriter (имя файла);
XMLWriter xmlWriter = новый XMLWriter (fileWriter);
xmlWriter.write(документ);
xmlWriter.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public void parserXml (String fileName) {
Файл inputXml = новый файл (имя_файла);
SAXReader saxReader = новый SAXReader ();
пытаться {
Документ document = saxReader.read(inputXml);
Сотрудники элемента=document.getRootElement();
for(Итератор i = сотрудники.elementIterator(); i.hasNext();){
Сотрудник элемента = (Элемент) i.next();
for(Итератор j = сотрудник.elementIterator(); j.hasNext();){
Элемент node=(Element) j.next();
System.out.println(node.getName()+":"+node.getText());
}
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("dom4j parserXml");
}
}
4.JDOM генерирует и анализирует XML
Для того, чтобы уменьшить объем кодирования для DOM и SAX, появились преимущества JDOM: принцип 20-80 значительно уменьшает объем кода; Случаи использования: реализуемые функции просты, например анализ, создание и т. д., но на нижнем уровне JDOM по-прежнему использует документы SAX (наиболее часто используемые), DOM и Xanan.
Скопируйте код кода следующим образом:
пакет com.alisoft.facepay.framework.bean;
импортировать java.io.FileNotFoundException;
импортировать java.io.FileOutputStream;
импортировать java.io.IOException;
импортировать java.util.List;
импортировать org.jdom.Document;
импортировать org.jdom.Element;
импортировать org.jdom.JDOMException;
импортировать org.jdom.input.SAXBuilder;
импортировать org.jdom.output.XMLOutputter;
/**
*
* @author hongliang.dinghl
* JDOM генерирует и анализирует XML-документы.
*
*/
публичный класс JDomDemo реализует XmlDocument {
public void createXml (String fileName) {
Документ-документ;
Корень элемента;
root = новый элемент («сотрудники»);
документ = новый документ (корень);
Элемент сотрудник = новый элемент («Сотрудник»);
root.addContent(сотрудник);
Имя элемента = новый элемент («имя»);
name.setText("ddvip");
сотрудник.addContent(имя);
Элемент sex=new Element("sex");
sex.setText("м");
сотрудник.addContent(пол);
Элемент age=new Element("возраст");
age.setText("23");
сотрудник.addContent(возраст);
XMLOutputter XMLOut = новый XMLOutputter();
пытаться {
XMLOut.output(документ, новый FileOutputStream(имя_файла));
} catch (FileNotFoundException e) {
е.printStackTrace();
} catch (IOException e) {
е.printStackTrace();
}
}
public void parserXml (String fileName) {
SAXBuilder builder = новый SAXBuilder (ложь);
пытаться {
Документ document=builder.build(имя_файла);
Сотрудники элемента=document.getRootElement();
Список сотрудниковList=employees.getChildren("сотрудник");
for(int i=0;iElement сотрудник=(Элемент)employeeList.get(i);
Список сотрудниковInfo=employee.getChildren();
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());
}
}
} catch (JDOMException e) {
е.printStackTrace();
} catch (IOException e) {
е.printStackTrace();
}
}
}