Maison  >  Article  >  Java  >  Quatre façons d'analyser XML

Quatre façons d'analyser XML

零下一度
零下一度original
2017-06-23 09:24:242032parcourir

Quatre façons d'analyser le 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. DOM4J
Générer et analyser des documents XML
import 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. JDOM
Générer et analyser XML
import 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();
          }
     }
}
dom4j est un framework XML open source pour analyser les documents XML. Cet article décrit comment créer et modifier des documents XML à l'aide de l'analyseur inclus avec dom4j.

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.

Listing 1.

Exemple de document XML

(catalog.xml

) Utilisez ensuite le même analyseur pour modifier catalog.xml. Le listing 2 est le document XML modifié, catalog-modified.xml.

Listing 2.
<?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>
Document XML

modifié (catalog-modified.xml

) 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.

Cet article comprend les parties suivantes :
<?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 :

table>

import   org.dom4j.Document;

import   org.dom4j.DocumentHelper;

import   org.dom4j.Element;

importer org.dom4j.Document;

importer org.dom4j.DocumentHelper;

importer org.dom4j.Element;

 Document document =   DocumentHelper.createDocument();

Utilisez la classe DocumentHelper pour créer une instance de document. DocumentHelper est une classe d'usine d'API dom4j qui génère des nœuds de document XML.

Document document = DocumentHelper.createDocument(); td>

Element   catalogElement = document.addElement("catalog");

Utilisez la méthode addElement() pour créer le catalogue d'éléments racine. addElement() est utilisé pour ajouter des éléments à un document XML.

Element catalogElement = document.addElement("catalog");

 catalogElement.addComment("An XML   catalog");

Utilisez la méthode addComment() dans l'élément catalog pour ajouter le commentaire "Un catalogue XML".

catalogElement.addProcessingInstruction("target","text");

catalogElement.addComment("Un catalogue XML");

Utilisez la méthode addProcessingInstruction() dans l'élément de catalogue pour ajouter une instruction de traitement.

Element   journalElement =    catalogElement.addElement("journal");

catalogElement.addProcessingInstruction("target","text");

Utilisez la méthode addElement() dans l'élément catalog pour ajouter l'élément journal.

journalElement.addAttribute("title",   "XML Zone");

journalElement.addAttribute("publisher",   "IBM developerWorks");

Element journalElement = catalogElement.addElement("journal");

Element   articleElement=journalElement.addElement("article");

Utilisez la méthode addAttribute() pour ajouter des attributs de titre et d'éditeur à l'élément de journal.

journalElement.addAttribute("title", "XML Zone");

journalElement.addAttribute("publisher", "IBM DeveloperWorks");

articleElement.addAttribute("level",   "Intermediate");

articleElement.addAttribute("date",   "December-2001");

Ajoutez l'élément journal à l'élément article.

Element articleElement=journalElement.addElement("article");

Element   titleElement=articleElement.addElement("title");

Ajoutez des attributs de niveau et de date à l'élément article.

titleElement.setText("Java   configuration with XML Schema");

articleElement.addAttribute("level", "Intermediate");

articleElement.addAttribute("date", "Décembre-2001");

Element   authorElement=articleElement.addElement("author");

Ajoutez l'élément titre à l'élément article.

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");

Ajoutez l'élément auteur à l'élément article.
Element authorElement=articleElement.addElement("author");
Ajoutez l'élément firstname à l'élément author et définissez le texte de l'élément.
Element firstNameElement=authorElement.addElement("firstname");firstNameElement.setText("Marcello");
Ajouter le nom à l'élément auteur élément et définit le texte de l'élément.
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Comment installer cas-server-3.5.2 ?Article suivant:Comment installer cas-server-3.5.2 ?

Articles Liés

Voir plus