현재 위치: > 최신 기사 목록> XML_PARSE에서 불규칙한 XML 데이터를 처리 할 때 오류를 피하는 방법

XML_PARSE에서 불규칙한 XML 데이터를 처리 할 때 오류를 피하는 방법

M66 2025-04-28

PHP에서 XML 데이터를 처리 할 때 XML_PARSE ()는 XML 데이터를 구조화 된 정보로 구문 분석하는 데 도움이되는 일반적인 기능입니다. 그러나 불규칙하고 부정확 한 형식이거나 깔끔한 XML 데이터에 직면하면이 기능은 오류를 쉽게 던질 수있어 전체 프로그램이 중단되거나 출력 예외가 발생할 수 있습니다.

그렇다면 XML_PARSE ()를 사용할 때, 특히 불규칙한 XML을 발견 할 때 구문 분석 오류를 어떻게 피할 수 있습니까? 다음은 실용적인 팁과 코드 예제입니다.

1. 오류 감지 메커니즘을 활성화합니다

XML_PARSE ()를 사용하기 전에 프로그램이 조용히 실패하지 않고 구문 분석이 실패 할 때 특정 오류 정보가 캡처되도록 항상 오류 감지를 활성화하는 것이 좋습니다.

 $xml = '<root><item>데이터1<item><item>데이터2</item></root>'; // 불규칙한XML

$parser = xml_parser_create();
xml_set_error_code($parser, XML_ERROR_NONE);

if (!xml_parse($parser, $xml, true)) {
    $errorCode = xml_get_error_code($parser);
    $errorMsg = xml_error_string($errorCode);
    $line = xml_get_current_line_number($parser);
    $column = xml_get_current_column_number($parser);
    echo "구문 분석 오류:$errorMsg 에서 $line 좋아요,1. $column 목록\n";
}

xml_parser_free($parser);

2. 전처리에 libxml을 사용하십시오

불규칙한 XML을보다 안전하게 구문 분석하기 위해 LIBXML 의 결함 방해 모드를 사용하여 데이터를 전제 한 다음 XML_PARSE () 또는 SIMPLEXML_LOAD_STRING () 과 같은 함수로 처리하여 처리 할 수 ​​있습니다.

 libxml_use_internal_errors(true);

$xml = '<root><item>데이터1<item><item>데이터2</item></root>';

$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NONET | LIBXML_COMPACT | LIBXML_NOCDATA);

if (!$dom) {
    foreach (libxml_get_errors() as $error) {
        echo "LibXML 실수:{$error->message}\n";
    }
    libxml_clear_errors();
} else {
    echo "XML 성공적으로로드,계속 구문 분석 할 수 있습니다。\n";
}

3. 일반 또는 문자열 처리를 사용하여 XML을 미리 "수정"하십시오 (주의해서 사용).

때로는 데이터 소스가 외부 API를 반환하는 XML (예 : http://api.m66.net/data.xml )과 같은 데이터 소스가 불안정합니다. 이 경우 먼저 정규 또는 수동 방법을 사용하여 구부리지 않은 태그 또는 불법 문자와 같은 일반적인 문제를 해결할 수 있습니다.

 $xml = file_get_contents('http://api.m66.net/data.xml');

// 간단한 수정:미 세게 태그를 교체하십시오
$xml = preg_replace('/<item>([^<]*)<item>/', '<item>$1</item><item>', $xml);

// 然后再进좋아요解析
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
    echo "여전히 존재합니다 XML 실수,그것을 다루는 다른 방법을 시도하십시오。\n";
}
xml_parser_free($parser);

?? 참고 :이 방법은 형식에 특정 기대치가있는 시나리오에 적합하며 복잡한 구조 XML에 정기적 인 하드 수정을 사용하는 것이 좋습니다.

4. SimpleXML 또는 DOM을 사용하여 저수준 파서를 교체하십시오

때로는 도구를 변경하는 것이 더 안정적입니다. 예를 들어, SimpleXML 은 더 강력한 결함 허용 오류와 유지 관리가 더 쉽습니다.

 $xml = file_get_contents('http://api.m66.net/data.xml');

libxml_use_internal_errors(true);
$simpleXml = simplexml_load_string($xml);

if ($simpleXml === false) {
    echo "SimpleXML 분석이 실패했습니다,실수如下:\n";
    foreach (libxml_get_errors() as $error) {
        echo $error->message;
    }
} else {
    echo "SimpleXML 성공적인 분석!\n";
}

요약

xml_parse ()를 사용할 때 불규칙한 XML에 직면하는 모범 사례 :

  • 오류보고를 활성화하여 찾기 문제를 촉진합니다.

  • 전처리로 libxml 결함 내성 구문 분석을 사용하십시오.

  • 필요한 경우 XML을 수정하기 위해 정기 또는 domDocument를 사용하십시오.

  • 데이터 형식을 통제 할 수없는 경우 SimpleXML 과 같은 더 나은 결함 공차 파서를 사용하십시오.

XML 형식이 합리적이고 XML_PARSE ()를 사용하여 코드를 개선 할 수 있으며 형식 문제로 인해 전체 서비스가 느슨해지지 않아도됩니다.

이 팁이 모든 종류의 "까다로운"XML 데이터를 처리하는 데 도움이되기를 바랍니다. 특정 구문 분석 오류가 발생하면 XML 컨텐츠를 게시 할 수 있으며 귀하를 위해 분석 할 수도 있습니다 ~