Maison >Java >javaDidacticiel >Quatre façons d'analyser XML
XML est désormais devenu universel L'échange de données Le format, avec son indépendance de plate-forme, son indépendance de langue et son indépendance de système, apporte une grande commodité à l'intégration et à l'interaction des données. Pour les connaissances grammaticales et les détails techniques de XML lui-même, vous devez lire la littérature technique pertinente, qui comprend DOM (Document Object Model), DTD (Document Type Definition), SAX (Simple API for XML), XSD (Xml Schema Definition) ) , XSLT (Extensible Stylesheet Language Transformations), veuillez vous référer à la documentation du site officiel du w3c pour plus d'informations.
XML est analysé de la même manière dans différents langages, mais la syntaxe implémentée est différente. Il existe deux méthodes d'analyse de base, l'une s'appelle SAX et l'autre s'appelle DOM. SAX est basé sur l'analyse du flux d'événements et DOM est basé sur l'analyse de la structure arborescente des documents XML . Supposons que le contenu et la structure de notre XML soient les suivants :
<?xml version="1.0" encoding="UTF-8"?><employees><employee> <name>ddviplinux</name> <sex>m</sex> <age>30</age></employee></employees>
Cet article utilise le langage JAVA pour générer et analyser les documents XML de DOM et SAX.
Définissez d'abord une interface pour exploiter les documents XML, XmlDocument. Il définit l'interface pour créer et analyser les documents XML.
package com.beyond.framework.bean; /** * @author zhengwei * 定义XML文档建立与解析的接口 */ public interface XmlDocument { /** * 建立XML文档 * @param fileName 文件全路径名称 */ public void createXml(String fileName); /** * 解析XML文档 * @param fileName 文件全路径名称 */ public void parserXml(String fileName); }
1. DOMGénérer et analyser des documents XML
Définit un ensemble d'interfaces pour la version analysée d'un document XML. L'analyseur lit l'intégralité du document et crée une structure arborescente résidant en mémoire que le code peut ensuite manipuler à l'aide de l'interface DOM.
Avantages : L'intégralité de l'arborescence du document est en mémoire, facile à utiliser ; prend en charge la suppression, la modification, le réarrangement et d'autres fonctions
Inconvénients : L'intégralité du document est transférée en mémoire (y compris les nœuds inutiles) ; , une perte de temps et d'espace ;
Occasions d'utilisation : Une fois le document analysé, les données doivent être consultées plusieurs fois ; les ressources matérielles sont suffisantes (mémoire, CPU).
DomDemo ==.document = = .document.createElement("employees"= .document.createElement("employee"= .document.createElement("name".document.createTextNode("丁宏亮"= .document.createElement("sex".document.createTextNode("m"= .document.createElement("age".document.createTextNode("30"=== "gb2312""yes"= PrintWriter(= "生成XML文件成功!" ==== ( i = 0; i < employees.getLength(); i++== ( j = 0; j < employeeInfo.getLength(); j++== ( k = 0; k < employeeMeta.getLength(); k+++ ":" +"解析完毕"
2. SAXGénérer et analyser des documents XML
Pour résoudre le DOM Le problème se pose avec SAX. SAX, piloté par les événements. Lorsque l'analyseur trouve le début d'un élément, la fin d'un élément, le début ou la fin d'un texte, d'un document, etc., il envoie des événements et les programmeurs écrivent du code qui répond à ces événements et enregistre les données.
Avantages : Il n'est pas nécessaire de charger l'intégralité du document à l'avance et cela consomme moins de ressources ; le code de l'analyseur SAX est plus petit que le code de l'analyseur DOM et convient à l'applet et au téléchargement.
Inconvénients : Non persistant ; après l'événement, si les données ne sont pas enregistrées, les données seront perdues ; vous ne pouvez obtenir que le texte de l'événement, mais vous ne savez pas à quel élément appartient le texte ; à ;
Occasions d'utilisation : Applet ; ne nécessite qu'une petite quantité de contenu dans le document XML, rarement consulté ; moins de mémoire machine ; >
3. DOM4Jimport java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;/*** @author zhengwei * SAX文档解析*/public class SaxDemo implements XmlDocument { public void createXml(String fileName) { System.out.println("<<"+filename+">>"); } public void parserXml(String fileName) { SAXParserFactory saxfac = SAXParserFactory.newInstance(); try { SAXParser saxparser = saxfac.newSAXParser(); InputStream is = new FileInputStream(fileName); saxparser.parse(is, new MySAXHandler()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } class MySAXHandler extends DefaultHandler { boolean hasAttribute = false; Attributes attributes = null; public void startDocument() throws SAXException { System.out.println("文档开始打印了"); } public void endDocument() throws SAXException { System.out.println("文档打印结束了"); } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equals("employees")) { return; } if (qName.equals("employee")) { System.out.println(qName); } if (attributes.getLength() > 0) { this.attributes = attributes; this.hasAttribute = true; } } public void endElement(String uri, String localName, String qName) throws SAXException { if (hasAttribute && (attributes != null)) { for (int i = 0; i < attributes.getLength(); i++) { System.out.println(attributes.getQName(0) + attributes.getValue(0)); } } } public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch, start, length)); } }
DOM4J est une très, très excellente API XML Java, avec d'excellentes performances. , des fonctions puissantes et extrêmement simple d'utilisation
Point spécial, et c'est aussi un logiciel open source . De nos jours, vous pouvez constater que de plus en plus de logiciels Java utilisent DOM4J pour lire et écrire du XML. Il convient particulièrement de mentionner que même JAXM de Sun utilise également DOM4J.
4. JDOMimport java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /** * @author zhengwei * Dom4j 生成XML文档与解析XML文档 */ public class Dom4jDemo implements XmlDocument { public void createXml(String fileName) { Document document = DocumentHelper.createDocument(); Element employees=document.addElement("employees"); Element employee=employees.addElement("employee"); Element name= employee.addElement("name"); name.setText("ddvip"); Element sex=employee.addElement("sex"); sex.setText("m"); Element age=employee.addElement("age"); age.setText("29"); try { Writer fileWriter=new FileWriter(fileName); XMLWriter xmlWriter=new XMLWriter(fileWriter); xmlWriter.write(document); xmlWriter.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } public void parserXml(String fileName) { File inputXml=new File(fileName); SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read(inputXml); Element employees=document.getRootElement(); for(Iterator i = employees.elementIterator(); i.hasNext();){ Element employee = (Element) i.next();for(Iterator j = employee.elementIterator(); j.hasNext();){ Element node=(Element) j.next(); System.out.println(node.getName()+":"+node.getText()); } } } catch (DocumentException e) { System.out.println(e.getMessage()); } System.out.println("dom4j parserXml"); } }
Pour réduire le DOM, La quantité de codage dans SAX apparaît avec JDOM Avantages : Le principe 20-80 réduit considérablement la quantité de code ;
Occasions d'utilisation : les fonctions à implémenter sont simples, comme l'analyse, la création, etc., mais au niveau inférieur, JDOM utilise toujours les documents SAX (le plus couramment utilisé), DOM et Xanan.5. Utilisez dom4j pour analyser XML
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; /*** @author zhengwei * JDOM 生成与解析XML文档 */ public class JDomDemo implements XmlDocument { public void createXml(String fileName) { Document document; Element root; root=new Element("employees"); document=new Document(root); Element employee=new Element("employee"); root.addContent(employee); Element name=new Element("name"); name.setText("ddvip"); employee.addContent(name); Element sex=new Element("sex"); sex.setText("m"); employee.addContent(sex); Element age=new Element("age"); age.setText("23"); employee.addContent(age); XMLOutputter XMLOut = new XMLOutputter(); try { XMLOut.output(document, new FileOutputStream(fileName)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }public void parserXml(String fileName) { SAXBuilder builder=new SAXBuilder(false); try { Document document=builder.build(fileName); Element employees=document.getRootElement(); List employeeList=employees.getChildren("employee"); for(int i=0;i<EMPLOYEELIST.SIZE();I++){ iElement employee=(Element)employeeList.get(i); List employeeInfo=employee.getChildren(); for(int j=0;j<EMPLOYEEINFO.SIZE();J++){ System.out.println(((Element)employeeInfo.get(j)).getName()+":" +((Element)employeeInfo.get(j)).getValue()) } } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
L'API dom4j comprend un outil d'analyse des documents XML. Cet analyseur sera utilisé dans cet article pour créer un exemple de document XML.
Exemple de document XML
) Utilisez ensuite le même analyseur pour modifier catalog.xml. Le listing 2 est le document XML modifié, catalog-modified.xml.
<?xml version="1.0" encoding="UTF-8"?> <catalog> <!--An XML Catalog--> <?target instruction?><journal title="XML Zone" publisher="IBM developerWorks"> <article level="Intermediate" date="December-2001"> <title>Java configuration with XML Schema</title> <author> <firstname>Marcello</firstname> <lastname>Vitaletti</lastname> </author> </article></journal> </catalog>
) Par rapport à l'API DOM du W3C, l'avantage d'utiliser l'analyseur inclus dans dom4j est que dom4j prend en charge natif XPath. L'analyseur DOM ne prend pas en charge la sélection de nœuds à l'aide de XPath.
<?xml version="1.0" encoding="UTF-8"?><catalog> <!--An XML catalog--><?target instruction?><journal title="XML Zone" publisher="IBM developerWorks"><article level="Introductory" date="October-2002"> <title>Create flexible and extensible XML schemas</title> <author><firstname>Ayesha</firstname> <lastname>Malik</lastname> </author> </article></journal></catalog>
Préréglé
Créer un document
Modifier un document
Préréglage
Cet analyseur peut être obtenu auprès de . Rendre dom4j-1.4/dom4j-full.jar accessible sur le chemin de classe, qui inclut les classes dom4j, le moteur XPath et les interfaces SAX et DOM. Si vous utilisez déjà les interfaces SAX et DOM incluses dans l'analyseur JAXP, ajoutez dom4j-1.4/dom4j.jar au chemin de classe. dom4j.jar inclut la classe dom4j et le moteur XPath, mais n'inclut pas les interfaces SAX et DOM.
Création d'un document
Cette section traite du processus de création d'un document XML à l'aide de l'API dom4j et crée un exemple de document XML catalog.xml .
Utilisez l'instruction import pour importer la classe API dom4j :
importer org.dom4j.Element; |
Document document = DocumentHelper.createDocument(); |
Document document = DocumentHelper.createDocument(); td> |
Element catalogElement = document.addElement("catalog"); |
Element catalogElement = document.addElement("catalog");
|
Utilisez la méthode addComment() dans l'élément catalog pour ajouter le commentaire "Un catalogue XML".
|
Element journalElement = catalogElement.addElement("journal"); |
catalogElement.addProcessingInstruction("target","text"); |
journalElement.addAttribute("title", "XML Zone"); journalElement.addAttribute("publisher", "IBM developerWorks"); |
Element journalElement = catalogElement.addElement("journal"); |
Element articleElement=journalElement.addElement("article"); |
journalElement.addAttribute("title", "XML Zone"); journalElement.addAttribute("publisher", "IBM DeveloperWorks"); |
articleElement.addAttribute("level", "Intermediate"); articleElement.addAttribute("date", "December-2001"); |
Element articleElement=journalElement.addElement("article");
|
Ajoutez des attributs de niveau et de date à l'élément article.
|
Element authorElement=articleElement.addElement("author"); |
Element titleElement=articleElement.addElement("title");
|
Element firstNameElement=authorElement.addElement("firstname"); firstNameElement.setText("Marcello"); |
Utilisez la méthode setText() pour définir le texte de l'élément article.
titleElement.setText("Configuration Java avec schéma XML"); |
Element lastNameElement=authorElement.addElement("lastname"); lastNameElement.setText("Vitaletti"); |
Element authorElement=articleElement.addElement("author"); |
Element firstNameElement=authorElement.addElement("firstname");firstNameElement.setText("Marcello"); |
Element lastNameElement=authorElement.addElement("lastname");lastNameElement.setText("Vitaletti"); |
可以使用 addDocType()方法添加文档类型说明。
document.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd"); |
这样就向 XML 文档中增加文档类型说明:
如果文档要使用文档类型定义(DTD)文档验证则必须有 Doctype。
XML 声明 自动添加到 XML 文档中。
清单 3 所示的例子程序 XmlDom4J.java 用于创建 XML 文档 catalog.xml。
清单 3. 生成 XML 文档 catalog.xml 的程序(XmlDom4J.java)
import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;import java.io.*;public class XmlDom4J{public void generateDocument(){ Document document = DocumentHelper.createDocument(); Element catalogElement = document.addElement("catalog"); catalogElement.addComment("An XML Catalog"); catalogElement.addProcessingInstruction("target","text"); Element journalElement = catalogElement.addElement("journal"); journalElement.addAttribute("title", "XML Zone"); journalElement.addAttribute("publisher", "IBM developerWorks"); Element articleElement=journalElement.addElement("article"); articleElement.addAttribute("level", "Intermediate"); articleElement.addAttribute("date", "December-2001"); Element titleElement=articleElement.addElement("title"); titleElement.setText("Java configuration with XML Schema"); Element authorElement=articleElement.addElement("author"); Element firstNameElement=authorElement.addElement("firstname"); firstNameElement.setText("Marcello"); Element lastNameElement=authorElement.addElement("lastname"); lastNameElement.setText("Vitaletti"); document.addDocType("catalog",null,"file://c:/Dtds/catalog.dtd");try{ XMLWriter output = new XMLWriter( new FileWriter(new File("c:/catalog/catalog.xml"))); output.write( document ); output.close(); } catch(IOException e){ System.out.println(e.getMessage()); } }public static void main(String[] argv){ XmlDom4J dom4j=new XmlDom4J(); dom4j.generateDocument(); } }
这一节讨论了创建 XML 文档的过程,下一节将介绍使用 dom4j API 修改这里创建的 XML 文档。
修改文档
这一节说明如何使用 dom4j API 修改示例 XML 文档 catalog.xml。
使用 SAXReader 解析 XML 文档 catalog.xml:
SAXReader saxReader = new SAXReader(); Document document = saxReader.read(inputXml);
SAXReader 包含在 org.dom4j.io 包中。
inputXml 是从 c:/catalog/catalog.xml 创建的 java.io.File。使用 XPath 表达式从 article 元素中获得 level 节点列表。如果 level 属性值是“Intermediate”则改为“Introductory”。
List list = document.selectNodes("//article/@level" ); Iterator iter=list.iterator(); while(iter.hasNext()){ Attribute attribute=(Attribute)iter.next(); if(attribute.getValue().equals("Intermediate")) attribute.setValue("Introductory"); }
获取 article 元素列表,从 article 元素中的 title 元素得到一个迭代器,并修改 title 元素的文本。
list = document.selectNodes("//article" ); iter=list.iterator(); while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("title"); while(iterator.hasNext()){ Element titleElement=(Element)iterator.next(); if(titleElement.getText().equals("Java configuration with XML Schema")) titleElement.setText("Create flexible and extensible XML schema"); } }
通过和 title 元素类似的过程修改 author 元素。
清单 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文档修改成 catalog-modified.xml 文档。
清单 4. 用于修改 catalog.xml 的程序(Dom4Jparser.java)
import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.Attribute;import java.util.List;import java.util.Iterator;import org.dom4j.io.XMLWriter;import java.io.*;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class Dom4JParser{public void modifyDocument(File inputXml){try{ SAXReader saxReader = new SAXReader(); Document document = saxReader.read(inputXml); List list = document.selectNodes("//article/@level" ); Iterator iter=list.iterator();while(iter.hasNext()){ Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals("Intermediate")) attribute.setValue("Introductory"); } list = document.selectNodes("//article/@date" ); iter=list.iterator();while(iter.hasNext()){ Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals("December-2001")) attribute.setValue("October-2002"); } list = document.selectNodes("//article" ); iter=list.iterator();while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("title");while(iterator.hasNext()){ Element titleElement=(Element)iterator.next();if(titleElement.getText().equals("Java configuration with XMLSchema")) titleElement.setText("Create flexible and extensible XML schema"); } } list = document.selectNodes("//article/author" ); iter=list.iterator();while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("firstname");while(iterator.hasNext()){ Element firstNameElement=(Element)iterator.next();if(firstNameElement.getText().equals("Marcello")) firstNameElement.setText("Ayesha"); } } list = document.selectNodes("//article/author" ); iter=list.iterator();while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("lastname");while(iterator.hasNext()){ Element lastNameElement=(Element)iterator.next();if(lastNameElement.getText().equals("Vitaletti")) lastNameElement.setText("Malik"); } } XMLWriter output = new XMLWriter(new FileWriter( new File("c:/catalog/catalog-modified.xml") )); output.write( document ); output.close(); } catch(DocumentException e) { System.out.println(e.getMessage()); } catch(IOException e){ System.out.println(e.getMessage()); } }public static void main(String[] argv){ Dom4JParser dom4jParser=new Dom4JParser(); dom4jParser.modifyDocument(new File("c:/catalog/catalog.xml")); } }
结束语:包含在 dom4j 中的解析器是一种用于解析 XML 文档的非验证性工具,可以与JAXP、Crimson 或 Xerces 集成。本文说明了如何使用该解析器创建和修改 XML 文档。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!