>Java >java지도 시간 >XML을 구문 분석하는 네 가지 방법

XML을 구문 분석하는 네 가지 방법

零下一度
零下一度원래의
2017-06-23 09:24:242082검색

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 공식 웹사이트 설명서를 참조하세요.

 XML은 다른 언어에서도 동일한 방식으로 구문 분석되지만 구현되는 구문은 다릅니다. 두 가지 기본 구문 분석 방법이 있는데, 하나는 SAX이고 다른 하나는 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 파서 코드보다 작고 애플릿 및 다운로드에 적합합니다.

단점: 지속되지 않습니다. 데이터가 저장되지 않으면 상태가 유지되지 않습니다. 이벤트에서 텍스트만 얻을 수 있지만 해당 텍스트가 어떤 요소에 속하는지는 알 수 없습니다. : 애플릿만 필요하며 거의 재검토되지 않습니다.

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));
     }
}
3. DOM4J

XML 문서 생성 및 구문 분석 Java XML API,

뛰어난 성능, 강력한 기능 및 극도의 사용 편의성이라는 특별한 특징을 가지고 있습니다. 요즘에는 점점 더 많은 Java 소프트웨어가 DOM4J를 사용하여 XML을 읽고 쓰는 것을 볼 수 있습니다. 특히 Sun의 JAXM도 DOM4J를 사용하고 있다는 점은 언급할 가치가 있습니다.

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");
     }
}
4. JDOMXML 생성 및 구문 분석

 DOM 및 SAX 코딩 양을 줄이기 위해 JDOM이 등장했습니다.

장점: 20-80 원칙은 코드 양을 크게 줄입니다. 사용 사례: 구현되는 기능은 구문 분석, 생성 등 간단하지만, 최하위 수준에서 JDOM은 여전히 ​​SAX(가장 일반적으로 사용되는), DOM 및 Xanan 문서를 사용합니다.

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

5. dom4j를 사용하여 XML 구문 분석

 dom4j은 XML 문서 구문 분석을 위한 오픈 소스 XML 프레임워크입니다. 이 기사에서는 dom4j에 포함된 파서를 사용하여 XML 문서를 생성하고 수정하는 방법을 설명합니다.

 dom4j API에는 XML 문서를 구문 분석하는 도구가 포함되어 있습니다. 이 파서는 이 기사에서 샘플 XML 문서를 생성하는 데 사용됩니다.

 목록 1.

예제 XML

문서(카탈로그. .xml.

 목록 2.

수정된 XML 문서(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>
 W3C DOM API와 비교할 때 dom4j에 포함된 파서를 사용하면 dom4j에 로컬 XPath 지원. DOM 파서는 XPath를 사용한 노드 선택을 지원하지 않습니다.

이 문서에는 다음 부분이 포함되어 있습니다.

  • Presets

  • 문서 만들기

  • 문서 수정

 Presets

이 파서는 에서 얻을 수 있습니다. dom4j 클래스, XPath 엔진, SAX 및 DOM 인터페이스를 포함하는 클래스 경로에서 dom4j-1.4/dom4j-full.jar에 액세스할 수 있도록 만듭니다. JAXP 파서에 포함된 SAX 및 DOM 인터페이스를 이미 사용하고 있는 경우 클래스 경로에 dom4j-1.4/dom4j.jar을 추가하세요. dom4j.jar에는 dom4j 클래스와 XPath 엔진이 포함되어 있지만 SAX 및 DOM 인터페이스는 포함되어 있지 않습니다.

  문서 만들기

 이 섹션에서는 dom4j API를 사용하여 XML 문서를 만드는 과정을 설명하고 샘플 XML 문서 Catalog.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 CatalogElement = document.addElement("catalog");

addComment() 메서드를 사용하여 카탈로그 요소에 "XML 카탈로그"라는 주석을 추가합니다.

CatalogElement.addComment ("XML 카탈로그"); 저널 요소를 추가하려면 카탈로그 요소에서 addElement() 메소드를 사용하십시오. 저널 요소에 제목 및 출판사 속성을 추가하려면 addAttribute() 메소드를 사용하십시오.

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

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

 article 요소에 저널 요소를 추가합니다. 기사 요소에 수준 및 날짜 속성을 추가합니다.
articleElement.addAttribute("date", "December-2001");

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

을 기사 요소에 추가 제목 요소를 추가합니다. 기사 요소의 텍스트를 설정하려면 setText() 메소드를 사용하십시오. 기사 요소에 작성자 요소를 추가합니다. 작성자 요소에 이름 요소를 추가하고 요소의 텍스트를 설정합니다. 작성자 요소 요소에 성을 추가하고 요소 텍스트를 설정합니다. Element lastNameElement=authorElement.addElement("성");

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을 구문 분석하는 네 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.