>  기사  >  백엔드 개발  >  import_symbol php xml 분석 함수 코드 페이지 1/2

import_symbol php xml 분석 함수 코드 페이지 1/2

WBOY
WBOY원래의
2016-07-29 08:38:441075검색

우선 나는 컴퓨터 표준을 좋아한다는 점을 인정해야 한다. 모두가 업계 표준을 따른다면 인터넷은 더 나은 매체가 될 것입니다. 표준화된 데이터 교환 형식을 사용하면 개방형 및 플랫폼 독립적 컴퓨팅 모델이 가능해집니다. 이것이 바로 제가 XML 매니아인 이유입니다.
다행히 제가 가장 좋아하는 스크립트 언어는 XML을 지원할 뿐만 아니라 점점 더 많이 지원하고 있습니다. PHP를 사용하면 XML 문서를 인터넷에 빠르게 게시하고, XML 문서에 대한 통계 정보를 수집하고, XML 문서를 다른 형식으로 변환할 수 있습니다. 예를 들어, 나는 XML로 쓴 기사와 책을 관리하기 위해 PHP의 XML 처리 기능을 자주 사용합니다.
이 기사에서는 XML 문서를 처리하기 위해 PHP에 내장된 Expat 파서를 사용하는 방법에 대해 설명합니다. 예시를 통해 Expat의 처리 방법을 보여드리겠습니다. 그동안 예제를 통해
다음 방법을 확인할 수 있습니다.
자체 처리 기능 구축
XML 문서를 자체 PHP 데이터 구조로 변환
Expat 소개
XML 프로세서라고도 하는 XML 파서 프로그램이 XML 문서의 구조와 내용에 액세스할 수 있도록 합니다. Expat는 PHP 스크립팅 언어용 XML 파서입니다.
Mozilla, Apache, Perl과 같은 다른 프로젝트에서도 사용됩니다.
이벤트 기반 파서란 무엇인가요?
XML 파서의 두 가지 기본 유형:
트리 기반 파서: XML 문서를 트리 구조로 변환합니다. 이 유형의 파서는 결과 트리의 각 요소에 액세스할 수 있는 API를 제공하면서 전체 기사를 구문 분석합니다. 일반적으로 사용되는 표준은 DOM(Document Object Mode)입니다.
이벤트 기반 파서: XML 문서를 일련의 이벤트로 처리합니다. 특별한 이벤트가 발생하면 파서는 이를 처리하기 위해 개발자가 제공한 함수를 호출합니다.
이벤트 기반 파서에는 XML 문서에 대한 데이터 중심 보기가 있습니다. 즉, XML 문서의 구조가 아닌 데이터 부분에 중점을 둡니다. 이러한 파서는 문서를 처음부터 끝까지 처리하고 콜백 함수를 통해 요소 시작, 요소 끝, 기능 데이터 시작 등과 같은 이벤트를 애플리케이션에 보고합니다.
다음은 "Hello-World"에 대한 예제 XML 문서입니다.

Hello World
:
시작 요소: Greeting
CDATA 항목 시작, 값: Hello World
끝 요소: Greeting
트리 기반 파서와 달리 이벤트 기반 파서는 설명 문서 구조를 생성하지 않습니다. CDATA 항목에서 이벤트 기반 파서는 상위 요소
인사말에 대한 정보를 얻을 수 없습니다.
그러나 더 낮은 수준의 액세스를 제공하므로 리소스를 더 잘 활용하고 더 빠른 액세스가 가능합니다. 이렇게 하면 전체 문서를 메모리에 맞출 필요가 없습니다.
실제로 전체 문서가 실제 메모리 값보다 클 수도 있습니다.
Expat는 이러한 이벤트 기반 파서입니다. 물론 Expat을 사용하면 필요한 경우 PHP에서 완전한 기본 트리 구조를 생성할 수도 있습니다.
위의 Hello-World 예에는 완전한 XML 형식이 포함되어 있습니다. 그러나 연관된 DTD(Document Type Definition)도 없고 내장된 DTD도 없기 때문에 유효하지 않습니다.
Expat를 사용하면 아무런 차이가 없습니다. Expat는 유효성을 확인하지 않는 파서이므로 문서와 관련된 모든 DTD를 무시합니다. 그러나 문서는 여전히 완전한
형식이어야 하며 그렇지 않으면 Expat(다른 XML 호환 파서와 마찬가지로)가 오류 메시지와 함께 중지됩니다.
Exapt는 유효성을 검사하지 않는 파서로서 속도와 가벼움으로 인해 인터넷 프로그램에 이상적입니다.
Expat 컴파일
Expat는 PHP3.0.6 버전(또는 그 이상)으로 컴파일할 수 있습니다. Apache 1.3.9부터 Expat가 Apache의 일부로 포함되었습니다. Unix 시스템에서는 -with
-xml 옵션으로 PHP를 구성하여 PHP로 컴파일할 수 있습니다.
PHP를 Apache 모듈로 컴파일하면 기본적으로 Expat가 Apache의 일부로 포함됩니다. Windows에서는 XML 동적 링크 라이브러리를 로드해야 합니다.
XML 예: XMLstats
Expat의 기능을 이해하는 한 가지 방법은 예를 통해서입니다. 우리가 논의할 예는 Expat을 사용하여 XML 문서에 대한 통계를 수집하는 것입니다.
문서의 각 요소에 대해 다음 정보가 출력됩니다.
문서에서 요소가 사용된 횟수
요소의 문자 데이터 양
상위 요소 요소
요소의 하위 요소
참고: 데모 목적으로 PHP를 사용하여 요소의 상위 요소와 하위 요소를 저장하는 구조를 생성합니다.
준비
XML 파서를 생성하는 데 사용되는 함수 인스턴스는 xml_parser_create()입니다. 이 인스턴스는 향후 모든 기능에 사용됩니다. 이 아이디어는 PHP의 MySQL 함수의
연결 태그와 매우 유사합니다. 문서를 구문 분석하기 전에 이벤트 기반 구문 분석기는 일반적으로 특정 이벤트가 발생할 때 호출될 콜백 함수를 등록하도록 요구합니다.Expat에는
다음과 같은 7가지 가능한 이벤트가 정의되어 있습니다.
객체 XML 구문 분석 함수 설명
요소 xml_set_element_handler() 요소의 시작과 끝
문자 데이터 xml_set_character_data_handler()의 시작 문자 데이터 외부 엔터티 XML_SET_EXTERNAL_ENTITY_REF_HANDLER() 외부 엔터티가 나타납니다. ing_inStruction_handler() 처리 명령의 출현
xml_set_notation_deCl_handler() 메서드 기억
Default xml_set_default_handler() 핸들러를 지정하지 않는 기타 이벤트
모든 콜백 함수는 파서의 인스턴스를 첫 번째 매개변수(다른 매개변수와 함께)로 가져와야 합니다.
이 기사 마지막 부분에 있는 샘플 스크립트를 확인하세요. 주의할 점은 요소 처리 기능과 문자 데이터 처리 기능을 모두 사용한다는 점이다. 요소의 콜백 핸들러 함수는
xml_set_element_handler()를 통해 등록됩니다.
이 함수는 세 가지 매개변수를 사용합니다:
파서 인스턴스
시작 요소를 처리하는 콜백 함수의 이름
끝 요소를 처리하는 콜백 함수의 이름
시작할 때 XML 문서를 구문 분석하고 콜백 함수가 존재해야 합니다. PHP 매뉴얼에 설명된 프로토타입과 일관되게 정의되어야 합니다.
예를 들어 Expat는 시작 요소의 핸들러 함수에 세 개의 매개변수를 전달합니다. 스크립트 예시에서는 다음과 같이 정의됩니다.
function start_element($parser, $name, $attrs)
첫 번째 매개변수는 파서 식별자, 두 번째 매개변수는 시작 요소의 이름, 세 번째 매개변수는 요소의 모든 속성과 값을 포함하는 배열입니다.
XML 문서 구문 분석을 시작하면 Expat는 start_element() 함수를 호출하고 시작 요소를 발견할 때마다 매개변수를 전달합니다.
XML 케이스 접기 옵션
케이스 접기 옵션을 끄려면 xml_parser_set_option() 함수를 사용하세요. 이 옵션은 기본적으로 켜져 있으며, 핸들러 함수에 전달된 요소 이름이 자동으로
대문자로 변환됩니다. 그러나 XML은 대소문자를 구분합니다. 따라서 통계 XML 문서에서는 대소문자가 매우 중요합니다. 이 예에서는 케이스 접기 옵션을 꺼야 합니다.
문서 구문 분석
모든 준비 작업이 완료되면 이제 스크립트가 마침내 XML 문서를 구문 분석할 수 있습니다.
사용자 지정 함수인 Xml_parse_from_file()은 매개 변수에 지정된 파일을 열고 4kb 크기로 수행합니다. Parsing
xml_parse()는 xml_parse_from_file()과 동일합니다. 오류가 발생하면, 즉 XML 문서의 형식이 불완전할 경우 false를 반환합니다.
xml_get_error_code() 함수를 사용하여 마지막 오류의 숫자 코드를 가져올 수 있습니다.
오류 텍스트 메시지를 얻으려면 이 숫자 코드를 xml_error_string() 함수에 전달하세요.
현재 줄 번호의 XML을 출력하여 디버깅을 더 쉽게 만듭니다.
파싱 과정에서 콜백 함수를 호출합니다.
문서 구조 설명
문서를 구문 분석할 때 Expat에서 강조해야 할 질문은 문서 구조에 대한 기본 설명을 어떻게 유지할 것인가입니다.
앞서 언급했듯이 이벤트 기반 파서 자체는 구조적 정보를 생성하지 않습니다.
그러나 태그 구조는 XML의 중요한 기능입니다. 예를 들어, 요소 시퀀스 은 <figure><title>과 다른 것을 의미합니다. 즉, <br> 작가라면 누구나 책 제목과 그림 제목이 '제목'이라는 용어를 사용하더라도 서로 아무런 관련이 없다고 말할 것입니다. 따라서 이벤트 기반 파서로 XML <br>을 보다 효율적으로 처리하려면 자체 스택이나 목록을 사용하여 문서의 구조적 정보를 유지해야 합니다. <br>문서 구조를 미러링하려면 스크립트는 최소한 현재 요소의 상위 요소를 알아야 합니다. Exapt의 API를 사용하면 달성할 수 없습니다. <br> 상황에 맞는 정보 없이 현재 요소의 이벤트만 보고합니다. 따라서 자신만의 스택 구조를 구축해야 합니다. <br>스크립트 예제에서는 FILO(선입선출) 스택 구조를 사용합니다. 배열을 통해 스택은 모든 시작 요소를 저장합니다. 시작 요소 처리 함수의 경우 <br>array_push() 함수에 의해 현재 요소가 스택의 맨 위로 푸시됩니다. 이에 따라 끝 요소 처리 함수는 array_pop()을 통해 최상위 요소를 제거합니다. <br><book><title> 시퀀스의 경우 스택은 다음과 같이 채워집니다.
시작 요소 book: 스택의 첫 번째 요소에 "book" 할당 ($ 스택[0]).
시작 요소 제목: 스택 상단($stack[1])에 "제목"을 할당합니다.
끝 요소 제목: 스택($stack[1])에서 맨 위 요소를 제거합니다.
끝 요소 제목: 스택($stack[0])에서 맨 위 요소를 제거합니다.
PHP3.0은 $length 변수를 통해 요소의 중첩을 수동으로 제어하여 예제를 구현합니다. 이로 인해 스크립트가 더 복잡해 보입니다. PHP4.0은 array_pop() 및
array_push() 함수를 사용하여 스크립트를 더욱 간결하게 만듭니다.
데이터 수집
각 요소에 대한 정보를 수집하려면 스크립트가 각 요소의 이벤트를 기억해야 합니다. 전역 배열 변수 $elements를 사용하여 문서의 다양한 요소
를 모두 저장합니다. 배열의 항목은 요소 클래스의 인스턴스이며 4가지 속성(클래스의 변수)을 갖습니다.
$count - 문서에서 요소가 발견된 횟수
$chars - 문자의 바이트 수
$parents - 부모 요소
$childs - 자식 요소
의 이벤트 보시다시피 클래스 인스턴스를 배열에 저장하는 것은 식은 죽 먹기입니다.
참고: PHP의 기능은 전체 해당 배열을 탐색하는 것처럼 while(list() = Each()) 루프를 통해 전체 클래스 구조를 탐색할 수 있다는 것입니다. 모든 클래스 변수
(및 PHP3.0을 사용하는 경우 메소드 이름)는 문자열로 출력됩니다.
요소가 발견되면 해당 요소가 문서에 몇 번이나 나타나는지 추적하기 위해 해당 카운터를 증가시켜야 합니다. 해당 $elements 항목의 count 요소도 1씩 증가합니다.
또한 현재 요소가 하위 요소임을 상위 요소에 알려야 합니다. 따라서 현재 요소의 이름이 상위 요소의 $childs 배열 항목에 추가됩니다. 마지막으로, 현재
요소는 자신의 부모가 누구인지 기억해야 합니다. 따라서 상위 요소는 현재 요소의 $parents 배열 항목에 추가됩니다.
통계 정보 표시
나머지 코드는 $elements 배열과 해당 하위 배열을 반복하여 통계 결과를 표시합니다. 이것은 가장 간단한 중첩 루프입니다. 올바른 결과를 출력하지만 코드가 단순하지도 않고 작업을 완료하기 위해 매일 사용할 수 있는 루프일 뿐입니다.
스크립트 예제는 PHP의 CGI 모드에서 명령줄을 통해 호출되도록 설계되었습니다. 따라서 통계 결과 출력 형식은 텍스트 형식입니다. 인터넷
에서 스크립트를 사용하려면 출력 함수를 수정하여 HTML 형식을 생성해야 합니다.
요약
Exapt는 PHP용 XML 파서입니다. 이벤트 기반 파서로서 문서의 구조적 설명을 생성하지 않습니다. 그러나 낮은 수준의 액세스를 제공함으로써 리소스 활용도를 높이고 액세스 속도를 높일 수 있습니다.
Expat는 유효성을 검사하지 않는 파서로서 XML 문서에 첨부된 DTD를 무시하지만, 문서의 형식이 올바르지 않으면 오류 메시지와 함께 중지됩니다.
문서 처리를 위한 이벤트 처리 기능 제공
스택, 트리 등 자신만의 이벤트 구조를 구축하여 XML 구조 정보 마크업의 장점을 활용하세요.
새로운 XML 프로그램이 매일 등장하고 있으며 XML에 대한 PHP의 지원이 지속적으로 강화되고 있습니다(예: DOM 기반 XML 파서 LibXML에 대한 지원이 추가되었습니다).
PHP와 Expat를 사용하면 플랫폼 독립적이며 유효하고 개방적인 표준에 대비할 수 있습니다.

현재 페이지 1/2 12다음 페이지

위 내용은 1/2 페이지에export_symbol 내용을 포함하여 php xml 분석 함수 코드를 소개한 내용입니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.

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