2014-12-18 5 views
1

xml 파일을 구문 분석하는 아래 코드에서 다른 자식 값을 기반으로 자식 정보를 추출합니다. 코드는 잘 작동하지만, 내 xml 파일은 2백메가바이트 이상이 있고 내가 분석하고 사이트가 약 4 분 이상 :(SAX 및 XPATH를 사용하여 큰 XML 파일 구문 분석

$dom = new DOMDocument(); 
$xpath = new DOMXPath($dom); 
$reader = new XMLReader(); 
$reader->open('http://www.bookingassist.ro/test/HotelsPro.xml'); 
while ($reader->read()) { 
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'Hotel') { 
     $node = $dom->importNode($reader->expand(), true); 
     $dom->appendChild($node); 
     $h1name = $xpath->evaluate('string(/Hotel[HotelCode = "'.$hotelCodes[0].'"]/HotelName)', $node); 
     $dom->removeChild($node); 
     if ($h1name) { 
     $reader->close(); 
     break; 
     } 
    } 
} 

에로드하는 여러 data`s를 얻으려고 할 때 어떻게하면이 문서를 구문 분석 할 수 데이터 검색 속도가 빨라졌습니다. 인터넷을 통해 SAX가 검색했지만 사용 방법은 모르겠다.

+0

, 그것의 XMLReader와 DOM 사용 해제 - 서로 다른 API를 – ThW

답변

2

DOM 파서가 데이터를 메모리에로드합니다. SAX 파서는 매우 빠르고 효율적인 것으로 확인 된 스트림 파서입니다.

SAX 파에 대한 도전 XML을 통해 스트리밍 할 때 태그 이름을 알고 데이터를 캡처해야합니다.

당신은

  1. ... SAX 파서를 사용하도록 설정에 XML (열기 태그)의 시작 요소에 의해 트리거되는 첫 번째 함수를 세 가지 기능이 필요합니다. 이 함수는 여는 태그의 이름과 속성을 반환합니다.

    함수의 startElement의 ($ xml_parser, $ 이름 $ 특성)

  2. 는 XML (닫는 태그)의 최종 요소에 의해 유발되는 제 2 기능. 이 함수에서는 닫는 태그의 이름 만 반환됩니다.

    기능하는 endElement의 ($ xml_parser, $ 이름)

  3. 마지막으로, 시작 및 종료 소자 (개폐 태그) 사이에서 스트리밍되는 문자 데이터를 처리하는 제 기능.

    기능 CharacterData를 ($의 xml_parser, $ 데이터) 당신이 비행에 필요한 모든 정보를 저장, 작업을 수행하려면 다음 세 가지 기능으로 로직을 넣어해야합니다

. 다른 여는 태그 나 닫는 태그를 사용할 때 CASE 함수를 사용하여 다른 작업을 수행하십시오. 당신이 당신의 기능을 일단

, 당신은 당신은 xml_set_element_handlerxml_set_character_data_handler 옵션에서 함수 이름을 사용해야합니다 ... 파서를 초기화 할 수 있습니다. 이제

 //Initialise SAX parser 
$xml_parser = xml_parser_create("UTF-8"); //With UTF8 encoding 

//Set parser options 
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); //This is a default setting of making all tags uppercase, if set to false you will get the tag name as it's set in the XML. 
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, true); //This should skip values with no values 
xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); //Set the output as UTF-8 

xml_set_element_handler($xml_parser, "startElement", "endElement"); 
xml_set_character_data_handler($xml_parser, "characterData"); 

당신이 스트림을 열 수 있습니다 ....

$ XML-> 열기 ('http://www.bookingassist.ro/test/HotelsPro.xml');

그리고 데이터를 구문 분석합니다. 시작 태그, 종료 태그 또는 문자 데이터에 따라 세 가지 기능 중 하나가 트리거됩니다.

while ($data = read($xml, 4096)) 
    { 
     if (!xml_parse($xml_parser, $data, feof($xml)))  { 
      echo "Error in the XML data\t" . xml_error_string(xml_get_error_code($xml_parser))); 
      break; 
    } 

}

파서가 완료되면, 자원 .... 예 SAX 아니라고

xml_parser_free($xml_parser);