Heim  >  Artikel  >  Java  >  Vier Möglichkeiten zum Parsen von XML

Vier Möglichkeiten zum Parsen von XML

零下一度
零下一度Original
2017-06-23 09:24:242049Durchsuche

Vier Möglichkeiten, XML zu analysieren

XML ist mittlerweile zu einem universellen Datenaustausch geworden Das Format bietet mit seiner Plattformunabhängigkeit, Sprachunabhängigkeit und Systemunabhängigkeit großen Komfort bei der Datenintegration und -interaktion. Für grammatikalische Kenntnisse und technische Details von XML selbst müssen Sie relevante Fachliteratur lesen, darunter DOM (Document Object Model), DTD (Document Type Definition), SAX (Simple API for XML) und XSD (Xml Schema Definition). , XSLT (Extensible Stylesheet Language Transformations), weitere Informationen finden Sie in der offiziellen Dokumentation der w3c-Website.

XML wird in verschiedenen Sprachen auf die gleiche Weise analysiert, die implementierte Syntax ist jedoch unterschiedlich. Es gibt zwei grundlegende Parsing-Methoden, eine heißt SAX und die andere heißt DOM. SAX basiert auf der Analyse von Ereignisströmen und DOM basiert auf der Analyse der XML-Dokumentbaumstruktur . Gehen Sie davon aus, dass der Inhalt und die Struktur unseres XML wie folgt sind:

<?xml   version="1.0" encoding="UTF-8"?><employees><employee>          <name>ddviplinux</name>          <sex>m</sex>          <age>30</age></employee></employees>

Dieser Artikel verwendet die JAVA-Sprache, um XML-Dokumente von DOM und SAX zu generieren und zu analysieren.
Definieren Sie zunächst eine Schnittstelle zum Betreiben von XML-Dokumenten, XmlDocument. Es definiert die Schnittstelle zum Erstellen und Parsen von XML-Dokumenten.

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. DOMXML-Dokumente generieren und analysieren

Definiert eine Reihe von Schnittstellen für die analysierte Version eines XML-Dokuments. Der Parser liest das gesamte Dokument ein und erstellt eine speicherresidente Baumstruktur, die der Code dann mithilfe der DOM-Schnittstelle bearbeiten kann.

Vorteile: Der gesamte Dokumentbaum befindet sich im Speicher und ist einfach zu bedienen.

Nachteile: Das gesamte Dokument wird in den Speicher übertragen (einschließlich nutzloser Knoten). , eine Verschwendung von Zeit und Platz;

Verwendungszwecke: Sobald das Dokument analysiert ist, muss mehrmals auf die Daten zugegriffen werden;

  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. SAXXML-Dokumente generieren und analysieren

Um DOM zu lösen Das Problem tritt bei SAX auf. SAX, ereignisgesteuert. Wenn der Parser den Anfang eines Elements, das Ende eines Elements, den Anfang oder das Ende eines Textes, eines Dokuments usw. findet, sendet er Ereignisse, und Programmierer schreiben Code, der auf diese Ereignisse reagiert und die Daten speichert.

Vorteile: Es ist nicht erforderlich, das gesamte Dokument im Voraus zu laden, und es beansprucht weniger Ressourcen. Der SAX-Parser-Code ist kleiner als der DOM-Parser-Code und eignet sich für Applet und Download.

Nachteile: nicht dauerhaft; wenn die Daten nicht gespeichert werden, gehen die Daten nur zustandslos verloren; Sie wissen jedoch nicht, zu welchem ​​Element der Text gehört zu;

Verwendungszwecke: Applet benötigt nur wenig Inhalt im XML-Dokument, seltener Zugriff auf den Maschinenspeicher; >

3. DOM4J
XML-Dokumente generieren und analysieren
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 ist eine sehr, sehr ausgezeichnete Java-XML-API, mit hervorragender Leistung , leistungsstarke Funktionen und extrem einfach zu bedienen

Besonderer

Punkt, und es ist auch eine Open-Source-Software . Heutzutage sieht man, dass immer mehr Java-Software DOM4J zum Lesen und Schreiben von XML verwendet. Besonders erwähnenswert ist, dass sogar Suns JAXM auch DOM4J verwendet.

4. JDOM
XML generieren und analysieren
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");
     }
}

Um DOM zu reduzieren, Der Codierungsumfang in SAX erscheint mit JDOM. Vorteile: Das 20-80-Prinzip reduziert den Codeumfang erheblich.

Verwendungszwecke: Die zu implementierenden Funktionen sind einfach, z. B. Parsen, Erstellen usw., aber auf der untersten Ebene verwendet JDOM weiterhin SAX-Dokumente (am häufigsten verwendet), DOM und Xanan-Dokumente.

5. Verwenden Sie dom4j zum Parsen von 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 ist ein Open-Source-XML-Framework zum Parsen von XML-Dokumenten. In diesem Artikel wird beschrieben, wie Sie XML-Dokumente mit dem in dom4j enthaltenen Parser erstellen und ändern.

 Die dom4j-API enthält ein Tool zum Parsen von XML-Dokumenten. Dieser Parser wird in diesem Artikel verwendet, um ein Beispiel-XML-Dokument zu erstellen.

Listing 1.

Beispiel-XML-

Dokument (catalog.xml

) Verwenden Sie dann denselben Parser, um „catalog.xml“ zu ändern. Listing 2 ist das geänderte XML-Dokument „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>
Modifiziertes XML-

Dokument (catalog-modified.xml

) Im Vergleich zur W3C-DOM-API besteht der Vorteil der Verwendung des in dom4j enthaltenen Parsers darin, dass dom4j über native XPath-Unterstützung verfügt. Der DOM-Parser unterstützt die Auswahl von Knoten mithilfe von XPath nicht.

Dieser Artikel enthält die folgenden Teile:
<?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>
  • Voreingestellt

  • Dokument erstellen

  • Dokument ändern

Voreinstellung

Dieser Parser kann von bezogen werden. Machen Sie dom4j-1.4/dom4j-full.jar im Klassenpfad zugänglich, der die dom4j-Klassen, die XPath-Engine sowie die SAX- und DOM-Schnittstellen umfasst. Wenn Sie bereits die im JAXP-Parser enthaltenen SAX- und DOM-Schnittstellen verwenden, fügen Sie dom4j-1.4/dom4j.jar zum Klassenpfad hinzu. dom4j.jar enthält die dom4j-Klasse und die XPath-Engine, jedoch keine SAX- und DOM-Schnittstellen.

 Erstellen eines Dokuments

In diesem Abschnitt wird der Prozess der Erstellung eines XML-Dokuments mithilfe der dom4j-API erläutert und ein Beispiel-XML-Dokument „catalog.xml“ erstellt .

Verwenden Sie die Importanweisung, um die dom4j-API-Klasse zu importieren:

table>

import   org.dom4j.Document;

import   org.dom4j.DocumentHelper;

import   org.dom4j.Element;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

 Document document =   DocumentHelper.createDocument();

Verwenden Sie die DocumentHelper-Klasse, um eine Dokumentinstanz zu erstellen. DocumentHelper ist eine dom4j-API-Factory-Klasse, die XML-Dokumentknoten generiert.

Document document = DocumentHelper.createDocument(); td>

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

Verwenden Sie die Methode addElement(), um den Stammelementkatalog zu erstellen. addElement() wird verwendet, um Elemente zu einem XML-Dokument hinzuzufügen.

ElementkatalogElement = document.addElement("catalog");

 catalogElement.addComment("An XML   catalog");

Verwenden Sie die Methode addComment() im Katalogelement, um den Kommentar „Ein XML-Katalog“ hinzuzufügen.

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

katalogElement.addComment("Ein XML-Katalog");

Verwenden Sie die Methode addProcessingInstruction() im Katalogelement, um eine Verarbeitungsanweisung hinzuzufügen.

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

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

Verwenden Sie die Methode addElement() im Katalogelement, um das Journalelement hinzuzufügen.

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

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

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

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

Verwenden Sie die Methode addAttribute(), um Titel- und Herausgeberattribute zum Journalelement hinzuzufügen.

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

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

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

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

Fügen Sie das Journal-Element zum Artikel-Element hinzu.

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

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

Fügen Sie dem Artikelelement Ebenen- und Datumsattribute hinzu.

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

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

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

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

Fügen Sie das Titelelement zum Artikelelement hinzu.

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

Element  firstNameElement=authorElement.addElement("firstname");

firstNameElement.setText("Marcello");

Verwenden Sie die setText()-Methode, um den Text des Artikelelements festzulegen.

titleElement.setText("Java-Konfiguration mit XML-Schema");

Element   lastNameElement=authorElement.addElement("lastname");

lastNameElement.setText("Vitaletti");

Fügen Sie das Autorelement zum Artikelelement hinzu.
Element authorElement=articleElement.addElement("author");
Fügen Sie das Element „firstname“ zum Element „author“ hinzu und legen Sie den Text des Elements fest.
Element firstNameElement=authorElement.addElement("firstname");firstNameElement.setText("Marcello");
Nachname zum Autorelement hinzufügen Element und legt den Text des Elements fest.
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 文档。

Das obige ist der detaillierte Inhalt vonVier Möglichkeiten zum Parsen von XML. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Wie installiere ich cas-server-3.5.2?Nächster Artikel:Wie installiere ich cas-server-3.5.2?

In Verbindung stehende Artikel

Mehr sehen