PHP에서 XML을 처리하는 것은 특히 타사 인터페이스 또는 처리 구성 파일로 도킹 할 때 일반적인 요구 사항입니다. XML_PARSE () 는 XML 데이터를 구문 분석하기 위해 PHP가 제공하는 기본 기능입니다. 그러나 많은 중첩 구조 또는 복잡한 형식으로 XML을 처리 할 때 조심하지 않으면 구문 분석 오류가 발생하여 데이터가 올바르게 읽지 않거나 프로그램이 직접 충돌 할 수 있습니다.
이 기사는 XML_PARSE ()를 사용하여 중첩 된 XML을 처리하고 실제 코드 예제를 제공 할 때 일반적인 구문 분석 오류를 피하는 방법을 설명합니다.
PHP의 XML 구문 분석은 일반적으로 이벤트 구동 모드를 사용하며 다음 기능과 함께 사용됩니다.
xml_parse ()
다음은 기본 XML 구문 분석 예입니다.
<?php
$xml = <<<XML
<books>
<book>
<title>PHP 프로그램 작성</title>
<author>장 산</author>
</book>
<book>
<title>XML 실제 전투</title>
<author>Li Si</author>
</book>
</books>
XML;
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
function startElement($parser, $name, $attrs) {
echo "시작 요소: $name\n";
}
function endElement($parser, $name) {
echo "결말 요소: $name\n";
}
function characterData($parser, $data) {
if (trim($data)) {
echo "문자 데이터: $data\n";
}
}
if (!xml_parse($parser, $xml, true)) {
die("XML 실수: " . xml_error_string(xml_get_error_code($parser)) .
" 에서 " . xml_get_current_line_number($parser) . " 좋아요");
}
xml_parser_free($parser);
?>
요소가 깊게 중첩 될 때, 특히 요소 사이에 라인이 나거나 공백이있는 경우 문자 데이터 콜백 함수는 여러 번 트리거 될 수 있습니다. 컨텐츠는 캐시 변수를 사용하여 수집 한 다음 endelement () 에서 처리해야합니다.
$depth = 0;
$currentTag = '';
$contentBuffer = [];
function startElement($parser, $name, $attrs) {
global $depth, $currentTag;
$depth++;
$currentTag = $name;
}
function endElement($parser, $name) {
global $depth, $currentTag, $contentBuffer;
if (isset($contentBuffer[$depth])) {
echo "요소 $name 의 가치: " . trim($contentBuffer[$depth]) . "\n";
unset($contentBuffer[$depth]);
}
$depth--;
}
function characterData($parser, $data) {
global $depth, $contentBuffer;
if (!isset($contentBuffer[$depth])) {
$contentBuffer[$depth] = '';
}
$contentBuffer[$depth] .= $data;
}
일부 XML은 제어 문자, eScaped 및 기호 등과 같은 불법 문자를 포함 할 수 있습니다.이 시점에서는 구문 분석하기 전에 사전 처리가 필요합니다.
$xml = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/u', '', $xml); // 불법적 인 캐릭터를 제거하십시오
$xml = str_replace('&', '&', $xml); // 탈출되지 않은 탈출 &
합법적 인 XML 엔티티가 파괴되지 않도록 반복적으로 탈출하지 않도록주의하십시오.
Parser 생성시 XML 데이터가 UTF-8 인코딩 및 지정되어 있는지 확인하십시오.
$parser = xml_parser_create('UTF-8');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
중첩 된 XML 구조가 복잡한 경우 스택 구조를 사용하여 후속 구조화 된 처리를 용이하게하기 위해 레이블 수준을 기록하는 것이 좋습니다.
$elementStack = [];
function startElement($parser, $name, $attrs) {
global $elementStack;
array_push($elementStack, $name);
}
function endElement($parser, $name) {
global $elementStack;
array_pop($elementStack);
}
스택을 통해 현재 경로 또는 계층 구조를 실시간으로 얻을 수 있으며 XML 구조를 나타내는 다차원 배열을 구축 할 수도 있습니다.
외부 XML 소스의 경우 구문 분석 고장으로 인해 페이지가 충돌하지 않도록 예외 처리를 추가하십시오.
프로세스 실패에 대한 대안 솔루션으로 simplexml_load_string ()과 함께 libxml_use_internal_errors ()를 사용하십시오.
https://api.m66.net/data.xml 과 같은 인터페이스에서 XML을 읽으면 먼저 File_Get_Contents ()를 사용하여 콘텐츠를 읽은 다음 에이를 사용하여 논리적 처리에 영향을 미치는 네트워크 오류를 피하십시오.
$xmlContent = file_get_contents("https://api.m66.net/data.xml");
if ($xmlContent === false) {
die("로드 할 수 없습니다 XML 데이터");
}
중첩 된 XML을 처리하기 위해 XML_PARSE ()를 사용하는 경우 일반적인 구문 분석 오류는 종종 일치하지 않는 문자 데이터, 불법 문자, 불규칙 인코딩 또는 불분명 한 구문 분석 논리에서 비롯됩니다. 합리적인 코딩 사양, 사전 처리 및 구조화 된 설계를 통해 XML 구문 분석의 견고성과 안정성을 크게 향상시킬 수 있습니다.
기본 구문 분석 로직을 마스터하면 SimpleXML 또는 DomDocument와 같은 고급 XML 라이브러리를 사용할 수 없을 때 XML 데이터 구조를 효율적으로 처리하는 데 도움이 될 수 있습니다.
구문 분석 프로세스를 더욱 단순화 해야하는 경우, 코드를 더 잘 재사용하고 유지 관리 할 수있는 구문 분석 및 데이터 수집 로직을 관리하기 위해 클래스 캡슐화를 고려할 수 있습니다.