php 분석 xml 의 네 가지 간단 한 방법(실례 첨부)

10532 단어 php해석 하 다.xml
XML 처 리 는 개발 과정 에서 자주 만 나 는 것 으로 PHP 도 이에 대해 풍부 한 지원 을 한다.본 고 는 그 중의 몇 가지 해석 기술 에 대해 간략하게 설명 할 뿐이다.이 는 Xml parser,Simple XML,XML Reader,DOMDocument 을 포함한다.
1。 XML Expat Parser:
XML Parser 는 Expat XML 해상도 기 를 사용 합 니 다.Expat 는 이벤트 기반 해상도 기 로 XML 문 서 를 일련의 이벤트 로 간주 합 니 다.어떤 사건 이 발생 했 을 때,그것 은 지정 한 함수 로 그것 을 처리 합 니 다.Expat 는 문서 에 연 결 된 DTD 를 무시 하 는 검증 되 지 않 은 해상도 입 니 다.그러나 문서 의 형식 이 좋 지 않 으 면 오류 메시지 로 끝 납 니 다.이벤트 기반 이 고 검증 이 없 기 때문에 Expat 는 빠 르 고 웹 프로그램 에 적합 한 특성 을 가지 고 있 습 니 다.
XML Parser 의 장점 은 전체 xml 문 서 를 메모리 에 불 러 온 후에 처리 하 는 것 이 아니 라 분석 하면 서 처리 하 는 것 이기 때문이다.그러나 그 렇 기 때문에 xml 구 조 를 동적 으로 조정 하거나 xml 상하 문 구 조 를 바탕 으로 복잡 한 조작 을 해 야 하 는 수요 에 적합 하지 않다.구조 가 좋 은 xml 문 서 를 처리 하려 면 작업 을 잘 수행 할 수 있 습 니 다.주의해 야 할 것 은 XML Parser 는 세 가지 인 코딩 형식 만 지원 합 니 다.US-ASCII,ISO-8859-1 과 UTF-8 입 니 다.xml 데이터 가 다른 인 코딩 이 라면 세 가지 중 하나 로 먼저 변환 해 야 합 니 다.
XML Parser 에서 자주 사용 하 는 해석 방식 은 크게 두 가지 가 있 습 니 다(사실은 두 가지 함수 입 니 다):xmlparse_into_struct 와 xmlset_element_handler。
xml_parse_into_struct
이 방법 은 xml 데 이 터 를 두 배열 로 분석 하 는 것 입 니 다.
index 배열―Value 배열 의 중간 값 을 가리 키 는 위 치 를 포함 하 는 지침
value 배열―분 석 된 XML 데 이 터 를 포함 합 니 다.
이 두 배열 의 문 자 는 묘사 하기 가 좀 번 거 로 우 니 예 를 보 세 요.

$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array
"; print_r($index); echo "
Vals array
"; print_r($vals);
출력:

Index array
Array
(
  [PARA] => Array
    (
      [0] => 0
      [1] => 2
    )

  [NOTE] => Array
    (
      [0] => 1
    )
)

Vals array
Array
(
  [0] => Array
    (
      [tag] => PARA
      [type] => open
      [level] => 1
    )

  [1] => Array
    (
      [tag] => NOTE
      [type] => complete
      [level] => 2
      [value] => simple note
    )

  [2] => Array
    (
      [tag] => PARA
      [type] => close
      [level] => 1
    )
)
그 중에서 index 배열 은 태그 서명 을 key 로 하고 해당 하 는 값 은 배열 입 니 다.이 태그 가 value 배열 에 있 는 모든 위 치 를 포함 합 니 다.그리고 이 위 치 를 통 해 이 탭 에 대응 하 는 값 을 찾 습 니 다.
xml 에서 각 그룹의 데이터 형식 이 다 르 고 완전히 통일 되 지 않 으 면 코드 를 쓸 때 주의해 야 합 니 다.확실 하지 않 으 면 잘못된 결 과 를 얻 을 수 있 습 니 다.예 를 들 어 다음 의 이 예 는:

$xml = '
<infos>
<para><note>note1</note><extra>extra1</extra></para>
<para><note>note2</note></para>
<para><note>note3</note><extra>extra3</extra></para>
</infos>
';

$p = xml_parser_create();
xml_parse_into_struct($p, $xml, $values, $tags);
xml_parser_free($p);
$result = array();
//        bug  
for ($i=0; $i<3; $i++) {
 $result[$i] = array();
 $result[$i]["note"] = $values[$tags["NOTE"][$i]]["value"];
 $result[$i]["extra"] = $values[$tags["EXTRA"][$i]]["value"];
}
print_r($result);
위 와 같은 방식 으로 옮 겨 다 니 면 코드 가 간단 해 보이 지만 위 기 를 숨 기 는 것 이 가장 치 명 적 인 것 은 잘못된 결 과 를 얻 는 것 이다(extra 3 가 두 번 째 파 라 리 로 달 려 갔다).그래서 비교적 엄밀 한 방식 으로 옮 겨 다 녀 야 한다.

$result = array();
$paraTagIndexes = $tags['PARA'];
$paraCount = count($paraTagIndexes);
for($i = 0; $i < $paraCount; $i += 2) {
 $para = array();
 //  para         
 for($j = $paraTagIndexes[$i]; $j < $paraTagIndexes[$i+1]; $j++) {
  $value = $values[$j]['value'];
  if(empty($value)) continue;

  $tagname = strtolower($values[$j]['tag']);
  if(in_array($tagname, array('note','extra'))) {
   $para[$tagname] = $value;
  }
 }
 $result[] = $para;
}
사실 저 는 xml 를 잘 안 써 요.parse_into_struct 함수,그래서 위 에서 말 하 는'엄밀'코드 가 일치 하지 않 으 면 다른 상황 에서 bug 도 있 습 니 다.-|
xml_set_element_handler
이 방식 은 parser 에 처리 요소 의 시작,요소 의 종 료 를 위 한 리 셋 함수 입 니 다.세트 로 xmlset_character_data_handler 는 parser 에 데 이 터 를 설정 하 는 반전 함수 입 니 다.이런 방식 으로 쓴 코드 는 비교적 뚜렷 해서 유지 보수 에 유리 하 다.
Example:

$xml = <<<XML
<infos>
<para><note>note1</note><extra>extra1</extra></para>
<para><note>note2</note></para>
<para><note>note3</note><extra>extra3</extra></para>
</infos>
XML;

$result = array();
$index = -1;
$currData;

function charactor($parser, $data) {
 global $currData;
 $currData = $data;
}

function startElement($parser, $name, $attribs) {
 global $result, $index;
 $name = strtolower($name);
 if($name == 'para') {
  $index++;
  $result[$index] = array();
 }
}

function endElement($parser, $name) {
 global $result, $index, $currData;
 $name = strtolower($name);
 if($name == 'note' || $name == 'extra') {
  $result[$index][$name] = $currData;
 }
}

$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "charactor");
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!xml_parse($xml_parser, $xml)) {
 echo "Error when parse xml: ";
 echo xml_error_string(xml_get_error_code($xml_parser));
}
xml_parser_free($xml_parser);

print_r($result);
이 를 통 해 알 수 있 듯 이 set handler 방식 은 코드 줄 수가 많 지만 사고 방향 이 뚜렷 하고 가 독성 이 좋 지만 성능 이 첫 번 째 방식 보다 약간 느 리 고 유연성 이 강하 지 않다.XML Parser 는 기 존 버 전 을 사용 하 는 시스템 에 적용 되 는 PHP 4 를 지원 합 니 다.PHP 5 환경 에 대해 서 는 다음 과 같은 방법 을 우선 고려 하 세 요.
2。 SimpleXML
Simple XML 은 PHP 5 이후 제공 되 는 간단 하고 사용 하기 쉬 운 xml 도구 모음 으로 xml 를 처리 하기 쉬 운 대상 으로 변환 할 수도 있 고 xml 데 이 터 를 조직 하여 생 성 할 수도 있다.그러나 namespace 를 포함 하 는 xml 에는 적용 되 지 않 으 며 xml 형식 이 완전 해 야 합 니 다(well-formed).그것 은 세 가지 방법 을 제공 했다:simplexmlimport_dom、simplexml_load_file、simplexml_load_string,함수 명 은 함수 의 역할 을 직관 적 으로 설명 합 니 다.세 함수 가 모두 SimpleXMLelement 대상 으로 돌아 갑 니 다.데이터 의 읽 기/추 가 는 모두 SimpleXMLelement 를 통 해 작 동 합 니 다.

$string = <<<XML
<?xml version='1.0'?>
<document>
 <cmd>login</cmd>
 <login>imdonkey</login>
</document>
XML;

$xml = simplexml_load_string($string);
print_r($xml);
$login = $xml->login;//         SimpleXMLElement  
print_r($login);
$login = (string) $xml->login;//       ,        
print_r($login);
Simple XML 의 장점 은 개발 이 간단 하 다 는 것 입 니 다.단점 은 xml 전 체 를 메모리 에 불 러 온 후에 처리 하기 때문에 많은 내용 의 xml 문 서 를 분석 할 때 힘 이 부 칠 수 있 습 니 다.작은 파일 을 읽 고 xml 에 도 namespace 가 포함 되 어 있 지 않다 면 Simple XML 은 좋 은 선택 입 니 다.
3。 XMLReader
XML Reader 도 PHP 5 이후 확장(5.1 이후 기본 설치)입 니 다.커서 처럼 문서 흐름 에서 이동 하고 각 노드 에서 멈 추 며 유연 하 게 작 동 합 니 다.입력 이 빠 르 고 비 캐 시 에 대한 스 트림 접근 을 제공 합 니 다.스 트림 이나 문 서 를 읽 고 사용자 가 데 이 터 를 추출 하고 프로그램 에 의미 없 는 기록 을 건 너 뛸 수 있 습 니 다.
구 글 날씨 api 를 이용 하여 정 보 를 얻 는 예 를 들 어 XML Reader 의 사용 을 보 여 줍 니 다.여기 도 일부 함수 만 포함 되 어 있 으 며 공식 문 서 를 참고 하 시기 바 랍 니 다.

$xml_uri = 'http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';
$current = array();
$forecast = array();

$reader = new XMLReader();
$reader->open($xml_uri, 'gbk');
while ($reader->read()) {
 //get current data
 if ($reader->name == "current_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
  while($reader->read() && $reader->name != "current_conditions") {
   $name = $reader->name;
   $value = $reader->getAttribute('data');
   $current[$name] = $value;
  }
 }

 //get forecast data
 if ($reader->name == "forecast_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
  $sub_forecast = array();
  while($reader->read() && $reader->name != "forecast_conditions") {
   $name = $reader->name;
   $value = $reader->getAttribute('data');
   $sub_forecast[$name] = $value;
  }
  $forecast[] = $sub_forecast;
 }
}
$reader->close();
XML Reader 는 XML Parser 와 유사 하 며 모두 읽 으 면서 작 동 합 니 다.큰 차 이 는 SAX 모델 이'푸 시'모델 이라는 것 입 니 다.그 중에서 분석 기 는 이 벤트 를 응용 프로그램 으로 밀어 서 새로운 노드 를 읽 을 때마다 프로그램 에 알 리 고 XmlReader 를 사용 하 는 응용 프로그램 은 리더 에서 노드 를 마음대로 추출 할 수 있 으 며 제어 성 이 좋 습 니 다.
XML Reader 는 libxml 를 기반 으로 하기 때문에 일부 함 수 는 문 서 를 참고 하여 libxml 버 전에 적용 되 는 지 확인 해 야 합 니 다.
4。 DOMDocument
DOMDocument 은 PHP 5 이후 출시 된 DOM 확장의 일부분 으로 html/xml 를 만 들 거나 해석 할 수 있 으 며,현재 utf-8 인 코딩 만 지원 합 니 다.

$xmlstring = <<<XML
<?xml version='1.0'?>
<document>
 <cmd attr='default'>login</cmd>
 <login>imdonkey</login>
</document>
XML;

$dom = new DOMDocument();
$dom->loadXML($xmlstring);
print_r(getArray($dom->documentElement));

function getArray($node) {
 $array = false;

 if ($node->hasAttributes()) {
  foreach ($node->attributes as $attr) {
   $array[$attr->nodeName] = $attr->nodeValue;
  }
 }

 if ($node->hasChildNodes()) {
  if ($node->childNodes->length == 1) {
   $array[$node->firstChild->nodeName] = getArray($node->firstChild);
  } else {
   foreach ($node->childNodes as $childNode) {
   if ($childNode->nodeType != XML_TEXT_NODE) {
    $array[$childNode->nodeName][] = getArray($childNode);
   }
  }
 }
 } else {
  return $node->nodeValue;
 }
 return $array;
}
함수 명 으로 볼 때 자 바스 크 립 트 와 비슷 한 것 같 아 요.참고 한 것 같 아 요.DOMDocument 도 한번에 xml 을 메모리 에 불 러 오기 때문에 메모리 문제 도 주의해 야 합 니 다.PHP 는 이렇게 많은 xml 처리 방식 을 제공 합 니 다.개발 자 들 은 선택 에 있어 시간 을 들 여 프로젝트 수요 와 시스템 환경 에 적합 하고 유지 하기 쉬 운 방법 을 선택해 야 합 니 다.
이상 의 phop 에서 xml 를 해석 하 는 네 가지 간단 한 방법(인 스 턴 스 첨부)은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기