ホームページ  >  記事  >  Java  >  XMLを解析する4つの方法

XMLを解析する4つの方法

零下一度
零下一度オリジナル
2017-06-23 09:24:242050ブラウズ

4つの解析方法XML

が付いているのでとても便利です。 XML 自体の文法知識と技術的な詳細については、DOM (Document Object Model)、DTD (Document Type Definition)、SAX (Simple API for XML)、XSD (Xml Schema Definition) などの関連技術文献を読む必要があります。 、XSLT (Extensible Stylesheet Language Transformations) の詳細については、w3c 公式 Web サイトのドキュメントを参照してください。

XMLは異なる言語でも同じ方法で解析されますが、実装される構文は異なります。基本的な解析方法は 2 つあり、1 つは SAX と呼ばれ、もう 1 つは DOM と呼ばれます。 SAX はイベント ストリームの解析に基づいており、DOM は XML ドキュメントのツリー構造の解析に基づいています。 XML の内容と構造は次のとおりであると仮定します。

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

この記事では、JAVA 言語を使用して DOM と SAX の XML ドキュメントを生成および解析します。
まずXML文書を操作するためのインターフェースXmlDocumentを定義します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. DOMXMLドキュメントの生成と解析

XMLドキュメントの解析されたバージョンのインターフェースのセットを定義します。パーサーはドキュメント全体を読み取り、コードが DOM インターフェイスを使用して操作できるメモリ常駐ツリー構造を構築します。

利点: ドキュメントツリー全体がメモリ内にあるため、操作が簡単です。削除、変更、再配置などの機能をサポートしています。

欠点: ドキュメント全体をメモリに転送すると、時間とスペースが無駄になります。

使用状況: ドキュメントが解析されると、データに複数回アクセスする必要がありますが、ハードウェア リソース (メモリ、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. SAXXML文書の生成と解析

DOMの問題を解決するためにSAXが登場しました。 SAX、イベント駆動型。パーサーは要素の開始、要素の終了、テキスト、ドキュメントなどの開始または終了を検出するとイベントを送信し、プログラマはこれらのイベントに応答してデータを保存するコードを作成します。

利点: 事前にドキュメント全体をロードする必要がなく、使用するリソースが少ないため、SAX パーサー コードは DOM パーサー コードより小さく、アプレットやダウンロードに適しています。

欠点: 永続的ではありません。イベント後、データが保存されない場合、データは失われます。ただし、テキストがどの要素に属しているかはわかりません。場合: アプレットのみ。XML ドキュメントに少量のコンテンツが必要であり、再アクセスされることはほとんどありません。

XML ドキュメントの生成と解析
優れた Java XML API

優れたパフォーマンス、強力な機能、そして非常に使いやすいという特別な機能を備えたオープンソース ソフトウェアでもあります。最近では、XML の読み書きに DOM4J を使用する Java ソフトウェアが増えています。特に、Sun の JAXM も DOM4J を使用していることは注目に値します。

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

4. JDOMXMLの生成と解析 DOMとSAXのコーディング量を削減するために、JDOMが登場しました; 利点: 20-80原則により、コードの量が大幅に削減されます。

使用場面: 実装される機能は解析、作成など単純ですが、最下位レベルでは、JDOM は依然として SAX (最も一般的に使用される)、DOM、および Xanan ドキュメントを使用します。
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");
     }
}

5. dom4jを使用してXMLを解析します

dom4jは、XMLドキュメントを解析するためのオープンソースのXMLフレームワークです。この記事では、dom4j に含まれるパーサーを使用して XML ドキュメントを作成および変更する方法について説明します。

dom4j APIには、XMLドキュメントを解析するためのツールが含まれています。この記事では、このパーサーを使用してサンプル XML ドキュメントを作成します。

リスト 1.

XML の例 ドキュメント (catalog. .xml.

リスト 2.

変更された XML

document (catalog-modified.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();
          }
     }
}
W3C DOM API と比較して、dom4j に含まれるパーサーを使用する利点は、dom4j がローカルなXPath のサポート。 DOM パーサーは、XPath を使用したノード選択をサポートしていません。 この記事には次の部分が含まれています:

  • Presets

  • Create document

  • Modify document

Presets

このパーサーは から入手できます。クラスパス上で dom4j-1.4/dom4j-full.jar にアクセスできるようにします。これには、dom4j クラス、XPath エンジン、SAX および DOM インターフェイスが含まれます。 JAXP パーサーに含まれる SAX および DOM インターフェースをすでに使用している場合は、クラスパスに dom4j-1.4/dom4j.jar を追加します。 dom4j.jar には、dom4j クラスと XPath エンジンが含まれていますが、SAX インターフェイスと DOM インターフェイスは含まれていません。

ドキュメントの作成

このセクションでは、dom4j API を使用して XML ドキュメントを作成するプロセスについて説明し、サンプル XML ドキュメント category.xml を作成します。

import ステートメントを使用して、dom4j API クラスをインポートします:

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

DocumentHelperクラスを使ってドキュメントインスタンスを作成します。 DocumentHelper は、XML ドキュメント ノードを生成する dom4j API ファクトリ クラスです。 addElement() メソッドを使用して、ルート要素カタログを作成します。 addElement() は、XML ドキュメントに要素を追加するために使用されます。

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

addComment() メソッドを使用して、カタログ要素にコメント「XML カタログ」を追加します。

catalogElement.addComment ("XML カタログ");カタログ要素で addElement() メソッドを使用して、ジャーナル要素を追加します。 addAttribute() メソッドを使用して、タイトルと発行者の属性をジャーナル要素に追加します。

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

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

article要素にjournal要素を追加します。記事要素にレベル属性と日付属性を追加します。

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

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

をarticle要素に追加タイトル要素を追加します。 setText() メソッドを使用して、article 要素のテキストを設定します。 author要素をarticle要素に追加します。 firstname 要素を author 要素に追加し、要素のテキストを設定します。 author 要素要素に lastname を追加し、要素テキストを設定します。 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 文档。

以上がXMLを解析する4つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。