1. Базовые знания:
Обычно Java использует четыре метода анализа XML: DOM, SAX, JDOM и DOM4J.
2. Введение в использование
1), ДОМ
(1)Введение
Интерфейс, предоставляемый W3C (org.w3c.dom), считывает весь XML-документ в память и строит дерево DOM для работы на каждом узле. Преимущество в том, что весь документ всегда находится в памяти, мы можем получить доступ к любому узлу в любое время, а обход дерева также является относительно привычной операцией; недостаток в том, что он потребляет память, и нам приходится ждать, пока все документы будут прочитаны в память; перед обработкой.
(2) Пример кода:
Скопируйте код кода следующим образом:
<?xml version="1.0"coding="UTF-8" Standalone="no"?>
<корень>
<Телефон>
<тип имя="Нокиа">
<price>599</price>
<оператор>CMCC</operator>
</тип>
<type name="Xiaomi">
<price>699</price>
<operator>ChinaNet</operator>
</тип>
</Телефон>
</корень>
Скопируйте код кода следующим образом:
импортировать java.io.ByteArrayOutputStream;
импортировать java.io.File;
импортировать java.io.FileOutputStream;
импортировать java.io.IOException;
импортировать java.io.StringReader;
импортировать javax.xml.parsers.DocumentBuilder;
импортировать javax.xml.parsers.DocumentBuilderFactory;
импортировать javax.xml.parsers.ParserConfigurationException;
импортировать 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.InputSource;
импортировать org.xml.sax.SAXException;
общественный класс XMLHandler {
общественный XMLHandler(){
}
публичная строка createXML(){
Строка xmlStr = ноль;
Фабрика DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
пытаться {
Конструктор DocumentBuilder = Factory.newDocumentBuilder();
Документ document = builder.newDocument();
document.setXmlVersion("1.0");
Корень элемента = document.createElement("root");
document.appendChild(корень);
Элемент телефон = document.createElement("TelePhone");
Элемент nokia = document.createElement("type");
nokia.setAttribute("имя", "Нокиа");
Элемент ценаNokia = document.createElement("цена");
ценаNokia.setTextContent("599");
nokia.appendChild(ценаNokia);
Элемент операторNokia = document.createElement("оператор");
операторNokia.setTextContent("CMCC");
nokia.appendChild(оператор Nokia);
телефон.appendChild(Нокиа);
Элемент xiaomi = document.createElement("type");
xiaomi.setAttribute("имя", "xiaomi");
Элемент PriceXiaoMi = document.createElement("цена");
ценаXiaoMi.setTextContent("699");
xiaomi.appendChild(ценаXiaoMi);
Элемент операторXiaoMi = document.createElement("оператор");
операторXiaoMi.setTextContent("ChinaNet");
xiaomi.appendChild(операторXiaoMi);
телефон.appendChild(Xiaomi);
root.appendChild(телефон);
TransformerFactory transFactory = TransformerFactory.newInstance();
Трансформатор transFormer = transFactory.newTransformer();
DOMSource domSource = новый DOMSource (документ);
//экспортируем строку
ByteArrayOutputStream бос = новый ByteArrayOutputStream ();
transFormer.transform(domSource, новый StreamResult(bos));
xmlStr = bos.toString();
//-------
//сохраняем как файл
Файл файл = новый файл("TelePhone.xml");
если(!file.exists()){
файл.createNewFile();
}
FileOutputStream out = новый FileOutputStream (файл);
StreamResult xmlResult = новый StreamResult (выход);
transFormer.transform(domSource, xmlResult);
//--------
} catch (ParserConfigurationException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}catch (TransformerConfigurationException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}catch (TransformerException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
вернуть xmlStr;
}
общественный недействительный parserXML (String strXML) {
Фабрика DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
пытаться {
Конструктор DocumentBuilder = Factory.newDocumentBuilder();
StringReader ср = новый StringReader (strXML);
InputSource = новый InputSource(sr);
Документ документа = builder.parse(is);
Элемент rootElement = doc.getDocumentElement();
Телефоны NodeList = rootElement.getElementsByTagName("type");
for (int i = 0; i <phones.getLength(); i++) {
Тип узла =phones.item(i);
String phoneName = ((Element)type).getAttribute("name");
System.out.println("Имя телефона = "+phoneName);
Свойства NodeList = type.getChildNodes();
for (int j = 0; j <properties.getLength(); j++) {
Свойство узла = Properties.item(j);
Строка nodeName = property.getNodeName();
if (nodeName.equals("цена")) {
Строковая цена=property.getFirstChild().getNodeValue();
System.out.println("price="+price);
} else if (nodeName.equals("оператор")) {
Строковый оператор=property.getFirstChild().getNodeValue();
System.out.println("operator="+operator);
}
}
}
} catch (ParserConfigurationException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}catch (SAXException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
public static void main(String[] args) {
Обработчик XMLHandler = новый XMLHandler();
Строка xml = handler.createXML();
System.out.println(xml);
handler.parserXML(xml);
}
}
(3) Разница между элементом и узлом (org.w3c.dom)
Объект Node — это основной тип данных всей объектной модели документа. Это самый простой объект в DOM, представляющий абстрактный узел в дереве документа. Однако при фактическом использовании объект Node редко используется напрямую. Вместо него используются подобъекты Element, Attr, Text и т. д. объекта Node.
Объект Element представляет элемент в документе HTML или XML и является основным подобъектом класса Node. Элемент может содержать атрибуты, поэтому у Element есть методы для доступа к его атрибутам.
Элемент унаследован от Node. Элемент — это мелкомасштабное определение, чтобы быть элементом. Это должен быть узел, содержащий полную информацию, например <div>...</div>. Но узел не обязательно является элементом, а элемент должен быть узлом.
node имеет несколько подтипов: Element, Text, Attribute, RootElement, Comment, Namespace и т. д.
2), САКС
3), ДЖДОМ
4), ДОМ4ДЖ
(1)Введение
dom4j на данный момент является лучшим средством синтаксического анализа XML (Hibernate и Sun JAXM также используют dom4j для анализа XML). Он включает в себя множество функций, выходящих за рамки базового представления XML-документов, включая встроенную поддержку XPath, поддержку XML-схемы и обработку больших или потоковых документов на основе событий.
При использовании XPATH добавьте jaxen.jar, иначе возникнет следующая ошибка:
Скопируйте код кода следующим образом:
Исключение в потоке «основной» java.lang.NoClassDefFoundError: org/jaxen/JaxenException
в org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
в org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
в org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
(2) Пример кода:
Скопируйте код кода следующим образом:
импортировать java.io.File;
импортировать java.io.FileWriter;
импортировать java.io.IOException;
импортировать java.io.StringReader;
импортировать java.io.StringWriter;
импортировать java.util.List;
импортировать org.dom4j.Document;
импортировать org.dom4j.DocumentException;
импортировать org.dom4j.DocumentHelper;
импортировать org.dom4j.Element;
импортировать org.dom4j.io.OutputFormat;
импортировать org.dom4j.io.SAXReader;
импортировать org.dom4j.io.XMLWriter;
импортировать org.xml.sax.InputSource;
общественный класс XMLHandler {
общественный XMLHandler() {
// TODO Автоматически сгенерированная заглушка конструктора
}
публичная строка createXML(){
Строка стрXML = ноль;
Документ документ = DocumentHelper.createDocument();
Корень элемента = document.addElement("root");
Элемент phone = root.addElement("TelePhone");
Элемент nokia = phone.addElement("type");
nokia.addAttribute("имя", "Нокиа");
Элемент Price_nokia = nokia.addElement("цена");
цена_nokia.addText("599");
Элементoperator_nokia = nokia.addElement("оператор");
operator_nokia.addText("CMCC");
Элемент xiaomi = phone.addElement("type");
xiaomi.addAttribute("имя", "xiaomi");
Элемент Price_xiaomi = xiaomi.addElement("цена");
цена_xiaomi.addText("699");
Элементoperator_xiaomi = xiaomi.addElement("оператор");
operator_xiaomi.addText("ChinaNet");
//--------
StringWriter strWtr = новый StringWriter();
Формат OutputFormat = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter = новый XMLWriter (strWtr, формат);
пытаться {
xmlWriter.write(документ);
} поймать (IOException e1) {
// TODO Автоматически сгенерированный блок catch
e1.printStackTrace();
}
стрXML = strWtr.toString();
//--------
//-------
//strXML=document.asXML();
//------
//-------------
Файл файл = новый файл("TelePhone.xml");
если (file.exists()) {
файл.удалить();
}
пытаться {
файл.createNewFile();
XMLWriter out = новый XMLWriter (новый FileWriter (файл));
out.write(документ);
out.flush();
выход.закрыть();
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
//-------------
вернуть стрXML;
}
общественный недействительный parserXML (String strXML) {
Читатель SAXReader = новый SAXReader();
StringReader ср = новый StringReader (strXML);
InputSource = новый InputSource(sr);
пытаться {
Документ document = reader.read(is);
Корень элемента = document.getRootElement();
// получаем элемент
List<Element> phoneList = root.elements("TelePhone");
List<Element> typeList = phoneList.get(0).elements("type");
for (int i=0;i<typeList.size();i++){
Элемент element = typeList.get(i);
String phoneName = element.attributeValue("name");
System.out.println("phonename = "+phoneName);
// получаем все элементы
List<Element> childList = element.elements();
for (int j=0;j<childList.size();j++){
Элемент e = childList.get(j);
System.out.println(e.getName()+"="+e.getText());
}
}
} catch (DocumentException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
общественный недействительный parserXMLbyXPath (String strXML) {
Читатель SAXReader = новый SAXReader();
StringReader ср = новый StringReader (strXML);
InputSource = новый InputSource(sr);
пытаться {
Документ document = reader.read(is);
Список list = document.selectNodes("/root/TelePhone/type");
for(int i=0;i<list.size();i++){
Элемент e = (Элемент) list.get(i);
System.out.println("phonename="+e.attributeValue("name"));
Список list1 = e.selectNodes("./*");
for(int j=0;j<list1.size();j++){
Элемент e1 = (Элемент) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
}
}
} catch (DocumentException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
/**
* @param аргументы
*/
public static void main(String[] args) {
// TODO Автоматически сгенерированная заглушка метода
Обработчик XMLHandler = новый XMLHandler();
Строка strXML=handler.createXML();
System.out.println(strXML);
handler.parserXML(strXML);
System.out.println("-----------");
handler.parserXMLbyXPath(strXML);
}
}
5)XPATH
(1)Введение
XPath — это язык для поиска информации в XML-документах. XPath используется для навигации по элементам и атрибутам в XML-документах.
Подробное описание синтаксиса можно найти по адресу: http://w3school.com.cn/xpath/index.asp.
(2) Пример кода:
Скопируйте код кода следующим образом:
импортировать java.io.IOException;
импортировать java.io.StringReader;
импортировать javax.xml.parsers.DocumentBuilder;
импортировать javax.xml.parsers.DocumentBuilderFactory;
импортировать javax.xml.parsers.ParserConfigurationException;
импортировать javax.xml.xpath.XPath;
импортировать javax.xml.xpath.XPathConstants;
импортировать javax.xml.xpath.XPathExpression;
импортировать javax.xml.xpath.XPathExpressionException;
импортировать javax.xml.xpath.XPathFactory;
импортировать org.w3c.dom.Document;
импортировать org.w3c.dom.Element;
импортировать org.w3c.dom.Node;
импортировать org.w3c.dom.NodeList;
импортировать org.xml.sax.InputSource;
импортировать org.xml.sax.SAXException;
общественный класс XMLHandler {
общественный XMLHandler() {
// TODO Автоматически сгенерированная заглушка конструктора
}
общественный недействительный parserXML (String strXML) {
Фабрика DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
пытаться {
Конструктор DocumentBuilder = Factory.newDocumentBuilder();
StringReader ср = новый StringReader (strXML);
InputSource = новый InputSource(sr);
Документ документа = builder.parse(is);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("/root/TelePhone/type");
NodeList телефоны = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i <phones.getLength(); i++) {
Тип узла =phones.item(i);
String phoneName = ((Element)type).getAttribute("name");
System.out.println("Имя телефона = "+phoneName);
XPathExpression expr1 = xpath.compile("./*");
Список NodeList = (NodeList) expr1.evaluate(type, XPathConstants.NODESET);
for(int j =0;j<list.getLength();j++){
Элемент e1 = (Элемент) list.item(j);
System.out.println(e1.getNodeName()+"="+e1.getTextContent());
}
}
} catch (ParserConfigurationException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}catch (SAXException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}catch (XPathExpressionException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
/**
* @param аргументы
*/
public static void main(String[] args) {
// TODO Автоматически сгенерированная заглушка метода
String strXML="<?xml version=/"1.0/" кодировка=/"UTF-8/" автономный=/"no/"?>"+
"<корень>"+
"<Телефон>"+
"<type name="nokia/">"+
"<price>599</price>"+
"<operator>CMCC</operator>"+
"</type>"+
"<type name="xiaomi/">"+
"<price>699</price>"+
"<operator>ChinaNet</operator>"+
"</type>"+
"</Телефон>"+
"</root>";
Обработчик XMLHandler = новый XMLHandler();
handler.parserXML(strXML);
}
}
PS: Вот несколько онлайн-инструментов для операций с XML для справки:
Онлайн-инструмент преобразования XML/JSON:
http://tools.VeVB.COm/code/xmljson
Онлайн-форматирование XML/Онлайн-сжатие XML:
http://tools.VeVB.COm/code/xmlformat
Онлайн-инструмент сжатия/форматирования XML:
http://tools.VeVB.COm/code/xml_format_compress