현재 위치: > 최신 기사 목록> XML_PARSE_INTO_STRUCC 공통 오류 : 파싱 실패 및 솔루션의 이유

XML_PARSE_INTO_STRUCC 공통 오류 : 파싱 실패 및 솔루션의 이유

gitbox 2025-06-05

1. 기능 소개

XML_PARSE_INTO_STRUCT () 는 국외 XML 구문 분석 라이브러리를 기반으로 한 함수이며 프로토 타입은 다음과 같습니다.

 int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
  • $ parser : XML_PARSER_CREATE () 에 의해 생성 된 파서.

  • $ 데이터 : XML 문자열이 구문 분석됩니다.

  • $ 값 : 순서대로 배열 된 XML 데이터 구조의 배열.

  • $ index : 옵션, 레이블 이름과 해당 색인을 기록하는 데 사용됩니다.

함수는 1을 반환하여 구문 분석이 성공했음을 나타내고, 함수는 0을 반환하여 고장을 나타냅니다.


2. 일반적인 분석 오류 및 이유

1. XML 형식 오류

XML은 매우 엄격한 서식 요구 사항을 가진 마크 업 언어이며 일반적인 오류는 다음과 같습니다.

  • unded되지 않은 태그

  • 속성은 인용되지 않습니다

  • 불법 캐릭터 (예 : 제어 문자)

  • 태그 중첩 오류

샘플 코드 :

 $data = '<root><item>Test</root>'; // 없어진 </item> 상표
$parser = xml_parser_create();
if (!xml_parse_into_struct($parser, $data, $values)) {
    echo "XML Error: " . xml_error_string(xml_get_error_code($parser));
}
xml_parser_free($parser);

산출:

 XML Error: mismatched tag

2. 코딩 불일치

XML 선언의 인코딩 (예 : <? xml version = "1.0"encoding = "utf-8"?> )은 실제 컨텐츠 인코딩과 일치하지 않으므로 구문 분석이 실패합니다.

예를 들어, 파일은 UTF-8으로 선언되지만 콘텐츠는 실제로 GBK 인코딩되어 불법 문자 오류가 발생합니다.

해결책 :

  • 파일 인코딩 및 XML 선언이 일관되어 있는지 확인하십시오.

  • mb_convert_encoding ()을 사용하여 UTF-8로 변환하십시오.

 $data = mb_convert_encoding($data, 'UTF-8', 'GBK');

3. 특수 캐릭터는 탈출되지 않습니다

< , > , & , "'XML의' 는 탈출 해야하는 특수 문자입니다.

  • <& & lt;

  • >& gt;

  • && amp;

예를 들어:

 $data = '<note>Tom & Jerry</note>'; // 실수:탈출되지 않았습니다 &

다음으로 변경해야합니다.

 $data = '<note>Tom &amp; Jerry</note>';

4. 불법 네임 스페이스 또는 태그 이름

레이블 이름은 숫자 나 특수 문자로 시작할 수 없으며 공백을 포함 할 수 없습니다. 예를 들어:

 <123tag>value</123tag> <!-- 불법적인 -->
<tag name="a b">value</tag> <!-- 속성 값의 공간은 인용되지 않습니다 -->

3. 아이디어 예약 및 디버깅 기술

1. XML_GET_ERROR_CODE () 및 XML_GET_CURRENT_LINE_NUMBER () 사용

이 두 기능은 문제를 신속하게 찾는 데 도움이 될 수 있습니다.

 if (!xml_parse_into_struct($parser, $data, $values)) {
    echo "Error: " . xml_error_string(xml_get_error_code($parser)) . 
         " at line " . xml_get_current_line_number($parser);
}

2. 온라인 XML 검증 도구를 사용하십시오

문제 해결 과정에서 XML을 https://gitbox.net/tools/xml-validator/ 와 같은 온라인 확인 도구에 붙여 넣어 구문 오류를 빠르게 발견 할 수 있습니다.

3. 원본 XML 단락을 인쇄하십시오

XML이 원격 인터페이스 또는 외부 파일에서 발생하는 경우, 구문 분석하기 전에 다음을 청소하고 기록하는 것이 좋습니다.

 file_put_contents('/tmp/raw_xml.log', $data);

또한 다음 청소 기능을 사용하는 것이 좋습니다.

 function clean_xml($data) {
    $data = trim($data);
    // 제거하다 BOM
    $data = preg_replace('/^\xEF\xBB\xBF/', '', $data);
    // 보이지 않는 문자 삭제
    return preg_replace('/[^\x09\x0A\x0D\x20-\x7F\xA0-\xFF]/', '', $data);
}

4. 제안 처리

1. libxml 오류 보고서를 켭니다

xml_parse_into_struct () 는 dom을 사용하지 않지만 xml을 읽기 전에 libxml_use_internal_errors ()를 사용하여 전체 디버깅에 도움이됩니다.

 libxml_use_internal_errors(true);

2. 대안 : SimpleXML 또는 dom을 사용하십시오

명확한 구조와 양호한 형식의 XML의 경우 SimpleXML이 더 권장됩니다.

 $xml = simplexml_load_string($data);

보다 친숙한 객체 인터페이스와 높은 결함 공차를 제공합니다.