목차
1. SAX 파싱
1.1. SAX 구문 분석 메커니즘
SAX 구문 분석 예
DOM을 사용하여 XML 문서 구문 분석 이를 수행하려면 전체 XML 문서를 읽고 메모리에 전체 DOM 트리의 Document 객체를 구축한 다음 XML 문서에서 작업해야 합니다. 이 경우 XML 문서의 용량이 특히 크면 컴퓨터 메모리를 많이 소모하게 되며, 심한 경우에는 메모리 오버플로가 발생할 수 있습니다.
Sax는 푸시 메커니즘입니다. Sax 파서를 생성하면 파서가 언제 알려줄 것입니다. 이는 XML 문서에서 콘텐츠를 찾습니다(Java Swing의 이벤트 수신과 다소 유사하게 사용자에게 이벤트를 푸시함). 이러한 결과로 무엇을 할지 결정하는 것은 프로그래머의 몫입니다. 색소폰 기반 프로그램에는 가장 일반적으로 사용되는 5가지 색소폰 이벤트가 있습니다.
1.2.SAX解析实例
백엔드 개발 XML/RSS 튜토리얼 XML - XML ​​구문 분석을 위한 SAX

XML - XML ​​구문 분석을 위한 SAX

Feb 24, 2017 pm 03:06 PM

1. SAX 파싱

  • DOM을 사용하여 XML 문서를 파싱할 때는 XML 문서 전체를 읽고 빌드해야 합니다. XML 문서를 작동하기 위해 전체 DOM 트리의 메모리 Document 개체에 있습니다. 이 경우 XML 문서의 용량이 특히 크면 컴퓨터 메모리를 많이 소모하게 되며, 심한 경우에는 메모리 오버플로가 발생할 수 있습니다.

  • SAX 구문 분석을 사용하면 전체 문서가 로드될 때까지 기다릴 필요 없이 문서를 읽을 때 문서를 처리할 수 있습니다.

  • DefaultHandler

을 상속받아 SAX 파서를 개발한다. [참고] SAX 메인을 사용한다 XML 문서를 구문 분석하기 위한 것이며 요소를 수정, 삭제 또는 추가할 수 없습니다.

1.1. SAX 구문 분석 메커니즘

Sax는 푸시 메커니즘이므로 Sax 파서를 생성합니다. 파서는 XML 문서에서 콘텐츠를 찾으면 이를 알려줍니다(Java Swing의 이벤트 수신과 다소 유사하게 이벤트를 사용자에게 푸시함). 이러한 결과로 무엇을 할지 결정하는 것은 프로그래머의 몫입니다.

sax 기반 프로그램에는 가장 일반적으로 사용되는 5가지 sax 이벤트가 있습니다.

1.startDocument()–> 파서가 문서 스캔을 시작한다고 알려줍니다.
2.endDocument()–> 파서가 문서의 끝을 찾았음을 알려줍니다.
3.startElement()–> 파서가 시작 태그를 찾았음을 알려줍니다. 이 이벤트는 태그 이름, 모든 속성 이름 및 요소 값을 알려줍니다. 4.characters()–>는 파서가 일부 텍스트를 찾았음을 알려주고 문자 배열, 배열의 오프셋 및 길이 오프셋을 가져옵니다.
5.endElement()–> 파서가 종료 태그를 찾았음을 알려줍니다.

SAX 구문 분석 예

다음과 같이 DOM 구문 분석에 사용되는 XML 예제를 사용합니다.

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
로그인 후 복사
로그인 후 복사

[단계]:

1. SAXParserFactory를 사용하여 SAX 구문 분석 팩토리를 만듭니다. 🎜>
SAXParserFactory spf = SAXParserFactory.newInstance();
로그인 후 복사
로그인 후 복사

2. SAX 파싱 팩토리를 통해 파서 개체를 얻습니다.

SAXParser sp = spf.newSAXParser();
로그인 후 복사
로그인 후 복사

3. 파싱 개체를 이벤트 핸들러 개체와 연결합니다.

sp.parse("src/myClass.xml",new MyHandler());
로그인 후 복사
로그인 후 복사

여기에

가 있어야 합니다. 직접 정의하고

을 상속받아야 하며, MyHandler 클래스에서 위에서 언급한 5개의 sax 이벤트 메서드를 다시 작성해야 합니다. 물론 필요한 것만 다시 작성할 수도 있습니다. DefaultHandler예를 들어 지금 제가 작성한 MyHandler은 다음과 같습니다.

class MyHandler extends DefaultHandler{    /**
     * 发现文档开始,该函数只会被调用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发现文档结束,该函数只会被调用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发现XML中的一个元素开始,会被反复调用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名称:"+qName);
    }    /**
     * 发现XML中的一个元素结束,会被反复调用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发现XML文件中的文本,会被反复调用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显示文本内容
        String text = new String(ch,start,length);        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}
로그인 후 복사
MyHandler실행 결과는 다음과 같습니다.

XML - XML ​​구문 분석을 위한 SAX보시다시피 , 이것은 XML 문서입니다. 일종의 순회가 있으며 sax가 할 수 있는 것은 순회뿐입니다.

이제 이러한 요구 사항이 있는 경우:

只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

클래스에 두 개의 부울 변수 isName 및 isAge를 정의할 수 있습니다.

메소드에서 이름 요소인지 연령 요소인지 식별합니다. 그렇다면 다음과 같이 MyHandler 메소드에서 해당 텍스트를 가져옵니다. startElementcharacters

1. 🎜>

private boolean isName = false;private boolean isAge = false;
로그인 후 복사
로그인 후 복사
2.

메소드에 판정 추가

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        this.isName = true;
    }else if(qName.equals("年龄")){        this.isAge = true;
    }
}
로그인 후 복사
startElement3. 식별자 Text

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}
로그인 후 복사
로그인 후 복사
를 기반으로 마지막으로 두 개의 부울 변수를 false로 재설정해야 합니다. characters실행 결과는 다음과 같습니다.


1. SAX 파싱 XML - XML ​​구문 분석을 위한 SAX

DOM을 사용하여 XML 문서 구문 분석 이를 수행하려면 전체 XML 문서를 읽고 메모리에 전체 DOM 트리의 Document 객체를 구축한 다음 XML 문서에서 작업해야 합니다. 이 경우 XML 문서의 용량이 특히 크면 컴퓨터 메모리를 많이 소모하게 되며, 심한 경우에는 메모리 오버플로가 발생할 수 있습니다.

  • SAX 구문 분석을 사용하면 전체 문서가 로드될 때까지 기다릴 필요 없이 문서를 읽을 때 문서를 처리할 수 있습니다.

  • DefaultHandler

을 상속받아 SAX 파서를 개발한다. [참고] SAX 메인을 사용한다 XML 문서를 구문 분석하기 위한 것이며 요소를 수정, 삭제 또는 추가할 수 없습니다.

1.1. SAX 파싱 메커니즘

Sax는 푸시 메커니즘입니다. Sax 파서를 생성하면 파서가 언제 알려줄 것입니다. 이는 XML 문서에서 콘텐츠를 찾습니다(Java Swing의 이벤트 수신과 다소 유사하게 사용자에게 이벤트를 푸시함). 이러한 결과로 무엇을 할지 결정하는 것은 프로그래머의 몫입니다. 색소폰 기반 프로그램에는 가장 일반적으로 사용되는 5가지 색소폰 이벤트가 있습니다.

1.startDocument()–>告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
2.endDocument()–>告诉你解析器发现了文档结尾
3.startElement()–>告诉你解析器发现了一个起始标签,该事件告诉你标签的名称、该元素所有的属性名和值
4.characters()–>告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以得到解析器发现的文本
5.endElement()–>告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

1.2.SAX解析实例

依然使用DOM解析中用到的XML例子,如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
로그인 후 복사
로그인 후 복사

【步骤】:

1.使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();
로그인 후 복사
로그인 후 복사

2.通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();
로그인 후 복사
로그인 후 복사

3.将解析对象和事件处理器对象关联

sp.parse("src/myClass.xml",new MyHandler());
로그인 후 복사
로그인 후 복사

这里的MyHandler需要自己定义,并且它要继承DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事件方法,当然也可以只重写自己需要的。
比如现在我写的MyHandler如下:

class MyHandler extends DefaultHandler{    /**
     * 发现文档开始,该函数只会被调用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发现文档结束,该函数只会被调用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发现XML中的一个元素开始,会被反复调用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名称:"+qName);
    }    /**
     * 发现XML中的一个元素结束,会被反复调用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发现XML文件中的文本,会被反复调用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显示文本内容
        String text = new String(ch,start,length);        
        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}
로그인 후 복사

运行结果如下:

XML - XML ​​구문 분석을 위한 SAX

可以看到,这是对XML文档的一种遍历,而sax能够做的也只是遍历了。


那么,如果现在我们有这样一个需求:只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement方法中标识是否是姓名元素或者年龄元素,如果是的话才在characters方法中获取对应的文本,如下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;
로그인 후 복사
로그인 후 복사

2.在startElement方法中添加判断

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        
        this.isName = true;
    }else if(qName.equals("年龄")){        this.isAge = true;
    }
}
로그인 후 복사

3.在characters方法中根据标识符进行判断是否获取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}
로그인 후 복사
로그인 후 복사

最后要记得将两个布尔变量复位成false。
运行结果如下:

XML - XML ​​구문 분석을 위한 SAX

 以上就是XML—XML解析之SAX的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PowerPoint를 사용하여 XML 파일을 열 수 있나요? PowerPoint를 사용하여 XML 파일을 열 수 있나요? Feb 19, 2024 pm 09:06 PM

XML 파일을 PPT로 열 수 있나요? XML, Extensible Markup Language(Extensible Markup Language)는 데이터 교환 및 데이터 저장에 널리 사용되는 범용 마크업 언어입니다. HTML에 비해 XML은 더 유연하고 자체 태그와 데이터 구조를 정의할 수 있으므로 데이터 저장과 교환이 더 편리하고 통합됩니다. PPT 또는 PowerPoint는 프레젠테이션 작성을 위해 Microsoft에서 개발한 소프트웨어입니다. 이는 포괄적인 방법을 제공합니다.

Python을 사용하여 XML 데이터 병합 및 중복 제거 Python을 사용하여 XML 데이터 병합 및 중복 제거 Aug 07, 2023 am 11:33 AM

Python을 사용하여 XML 데이터 병합 및 중복 제거 XML(eXtensibleMarkupLanguage)은 데이터를 저장하고 전송하는 데 사용되는 마크업 언어입니다. XML 데이터를 처리할 때 여러 XML 파일을 하나로 병합하거나 중복된 데이터를 제거해야 하는 경우가 있습니다. 이 기사에서는 Python을 사용하여 XML 데이터 병합 및 중복 제거를 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다. 1. XML 데이터 병합 XML 파일이 여러 개인 경우 이를 병합해야 합니다.

Python을 사용하여 XML 데이터 필터링 및 정렬 Python을 사용하여 XML 데이터 필터링 및 정렬 Aug 07, 2023 pm 04:17 PM

Python을 사용하여 XML 데이터 필터링 및 정렬 구현 소개: XML은 데이터를 태그 및 속성 형식으로 저장하는 일반적으로 사용되는 데이터 교환 형식입니다. XML 데이터를 처리할 때 데이터를 필터링하고 정렬해야 하는 경우가 많습니다. Python은 XML 데이터를 처리하는 데 유용한 많은 도구와 라이브러리를 제공합니다. 이 기사에서는 Python을 사용하여 XML 데이터를 필터링하고 정렬하는 방법을 소개합니다. XML 파일 읽기 시작하기 전에 XML 파일을 읽어야 합니다. Python에는 많은 XML 처리 라이브러리가 있습니다.

Python에서 XML 데이터를 CSV 형식으로 변환 Python에서 XML 데이터를 CSV 형식으로 변환 Aug 11, 2023 pm 07:41 PM

Python의 XML 데이터를 CSV 형식으로 변환 XML(ExtensibleMarkupLanguage)은 데이터 저장 및 전송에 일반적으로 사용되는 확장 가능한 마크업 언어입니다. CSV(CommaSeparatedValues)는 데이터 가져오기 및 내보내기에 일반적으로 사용되는 쉼표로 구분된 텍스트 파일 형식입니다. 데이터를 처리할 때, 간편한 분석과 처리를 위해 XML 데이터를 CSV 형식으로 변환해야 하는 경우가 있습니다. 파이썬은 강력하다

PHP를 사용하여 XML 데이터를 데이터베이스로 가져오기 PHP를 사용하여 XML 데이터를 데이터베이스로 가져오기 Aug 07, 2023 am 09:58 AM

PHP를 사용하여 데이터베이스로 XML 데이터 가져오기 소개: 개발 중에 추가 처리 및 분석을 위해 외부 데이터를 데이터베이스로 가져와야 하는 경우가 많습니다. 일반적으로 사용되는 데이터 교환 형식인 XML은 구조화된 데이터를 저장하고 전송하는 데 자주 사용됩니다. 이 기사에서는 PHP를 사용하여 XML 데이터를 데이터베이스로 가져오는 방법을 소개합니다. 1단계: XML 파일 구문 분석 먼저 XML 파일을 구문 분석하고 필요한 데이터를 추출해야 합니다. PHP는 XML을 구문 분석하는 여러 가지 방법을 제공하며 그 중 가장 일반적으로 사용되는 방법은 Simple을 사용하는 것입니다.

Python은 XML과 JSON 간의 변환을 구현합니다. Python은 XML과 JSON 간의 변환을 구현합니다. Aug 07, 2023 pm 07:10 PM

Python은 XML과 JSON 간의 변환을 구현합니다. 소개: 일상적인 개발 프로세스에서 우리는 종종 서로 다른 형식 간에 데이터를 변환해야 합니다. XML과 JSON은 일반적인 데이터 교환 형식입니다. Python에서는 다양한 라이브러리를 사용하여 XML과 JSON을 변환할 수 있습니다. 이 문서에서는 코드 예제와 함께 일반적으로 사용되는 몇 가지 방법을 소개합니다. 1. Python에서 XML을 JSON으로 변환하려면 xml.etree.ElementTree 모듈을 사용할 수 있습니다.

Python을 사용하여 XML의 오류 및 예외 처리 Python을 사용하여 XML의 오류 및 예외 처리 Aug 08, 2023 pm 12:25 PM

Python을 사용하여 XML에서 오류 및 예외 처리하기 XML은 구조화된 데이터를 저장하고 표현하는 데 일반적으로 사용되는 데이터 형식입니다. Python을 사용하여 XML을 처리할 때 때때로 오류와 예외가 발생할 수 있습니다. 이 기사에서는 Python을 사용하여 XML의 오류 및 예외를 처리하는 방법을 소개하고 참조용 샘플 코드를 제공합니다. XML 구문 분석 오류를 잡기 위해 try-Exception 문을 사용하십시오. Python을 사용하여 XML을 구문 분석할 때 가끔 오류가 발생할 수 있습니다.

Python은 XML의 특수 문자와 이스케이프 시퀀스를 구문 분석합니다. Python은 XML의 특수 문자와 이스케이프 시퀀스를 구문 분석합니다. Aug 08, 2023 pm 12:46 PM

Python은 XML의 특수 문자와 이스케이프 시퀀스를 구문 분석합니다. XML(eXtensibleMarkupLanguage)은 서로 다른 시스템 간에 데이터를 전송하고 저장하는 데 일반적으로 사용되는 데이터 교환 형식입니다. XML 파일을 처리할 때 특수 문자와 이스케이프 시퀀스가 ​​포함되어 구문 분석 오류가 발생하거나 데이터가 잘못 해석될 수 있는 상황이 자주 발생합니다. 따라서 Python을 사용하여 XML 파일을 구문 분석할 때 이러한 특수 문자와 이스케이프 시퀀스를 처리하는 방법을 이해해야 합니다. 1. 특수문자 및

See all articles