PHP XML Parsers
PHP XML Parsers : XML 파싱 및 처리하기
- *PHP에서 XML 파일을 파싱(XML Parsing)**하는 것은 XML 데이터를 읽고, 수정하며, 처리하는 데 사용됩니다. XML(Extensible Markup Language)은 데이터를 구조화하여 저장하고 전송할 수 있는 표준 형식입니다. PHP는 XML 데이터를 다룰 수 있는 여러 XML 파서(parsers)를 제공합니다. 주로 사용되는 파서는 SimpleXML, DOM, 그리고 XML Parser 함수들입니다.
이 가이드에서는 PHP에서 XML을 파싱하는 다양한 방법을 설명하고, 각각의 XML 파서(SimpleXML, DOM, XML Parser) 사용 예제를 제공합니다.
1. SimpleXML을 사용한 XML 파싱
SimpleXML은 XML 데이터를 간단하고 직관적으로 파싱할 수 있는 PHP 확장입니다. 주로 XML 데이터를 객체 형식으로 변환하여 쉽게 다룰 수 있게 해줍니다.
예시: SimpleXML로 XML 파일 파싱
XML 파일 (example.xml
)
<users>
<user>
<id>1</id>
<name>John Doe</name>
<email>john@example.com</email>
</user>
<user>
<id>2</id>
<name>Jane Doe</name>
<email>jane@example.com</email>
</user>
</users>
SimpleXML로 XML 데이터 파싱
<?php
// XML 파일을 SimpleXML 객체로 로드
$xml = simplexml_load_file('example.xml');
// 각 사용자 정보 출력
foreach ($xml->user as $user) {
echo "ID: " . $user->id . "<br>";
echo "Name: " . $user->name . "<br>";
echo "Email: " . $user->email . "<br><br>";
}
?>
설명:
simplexml_load_file()
: XML 파일을 SimpleXML 객체로 변환합니다.$xml->user
: 각<user>
태그에 접근하여 데이터를 가져옵니다.- 객체처럼 데이터를 다룰 수 있어 매우 직관적입니다.
2. DOM을 사용한 XML 파싱
DOMDocument 클래스는 XML 문서를 DOM 구조로 변환하여 XML 데이터를 구문 분석하고, 트리 구조로 데이터를 수정할 수 있게 해줍니다. DOM은 더 많은 기능을 제공하지만, 메모리 사용량이 많고 복잡성이 높습니다.
예시: DOM을 사용한 XML 데이터 파싱
<?php
// DOM 객체 생성
$dom = new DOMDocument();
// XML 파일 로드
$dom->load('example.xml');
// 모든 <user> 노드 가져오기
$users = $dom->getElementsByTagName('user');
// 각 사용자 정보 출력
foreach ($users as $user) {
$id = $user->getElementsByTagName('id')[0]->nodeValue;
$name = $user->getElementsByTagName('name')[0]->nodeValue;
$email = $user->getElementsByTagName('email')[0]->nodeValue;
echo "ID: $id<br>";
echo "Name: $name<br>";
echo "Email: $email<br><br>";
}
?>
설명:
DOMDocument
: XML 파일을 DOM 구조로 읽습니다.getElementsByTagName()
: 특정 태그 이름을 가진 모든 요소를 선택합니다.nodeValue
: XML 태그 내부의 값을 가져옵니다.
3. XML Parser를 사용한 XML 파싱 (이벤트 기반)
XML Parser는 이벤트 기반 파서로, XML 데이터를 순차적으로 읽으면서 이벤트가 발생할 때 특정 처리를 할 수 있습니다. 이 방식은 대용량 XML 파일을 처리할 때 유리하지만, 사용이 다소 복잡할 수 있습니다.
예시: XML Parser로 XML 데이터 파싱
<?php
// XML 파서 생성
$parser = xml_parser_create();
// 이벤트 핸들러 설정
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// XML 파일 읽기
$xmlData = file_get_contents('example.xml');
// XML 데이터 파싱
if (!xml_parse($parser, $xmlData, true)) {
die(sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
// 파서 해제
xml_parser_free($parser);
// 시작 태그 이벤트 처리
function startElement($parser, $name, $attrs) {
echo "Start tag: $name<br>";
}
// 종료 태그 이벤트 처리
function endElement($parser, $name) {
echo "End tag: $name<br>";
}
// 텍스트 데이터 처리
function characterData($parser, $data) {
echo "Character data: $data<br>";
}
?>
설명:
xml_parser_create()
: XML 파서를 생성합니다.xml_set_element_handler()
: XML 요소의 시작과 끝 태그 이벤트를 처리할 함수를 등록합니다.xml_set_character_data_handler()
: 텍스트 데이터를 처리할 함수를 등록합니다.- 이벤트 기반으로 XML 데이터가 순차적으로 처리됩니다.
4. XML 데이터 생성
PHP를 사용해 XML 데이터를 생성할 수도 있습니다. 주로 DOMDocument 클래스를 사용하여 XML 트리를 구성한 후, 이를 XML 파일이나 문자열로 저장할 수 있습니다.
예시: DOM을 사용한 XML 생성
<?php
// DOM 객체 생성
$dom = new DOMDocument('1.0', 'UTF-8');
// <users> 루트 요소 생성
$users = $dom->createElement('users');
$dom->appendChild($users);
// 첫 번째 <user> 요소 생성
$user1 = $dom->createElement('user');
$id1 = $dom->createElement('id', 1);
$name1 = $dom->createElement('name', 'John Doe');
$email1 = $dom->createElement('email', 'john@example.com');
// <user> 요소에 <id>, <name>, <email> 추가
$user1->appendChild($id1);
$user1->appendChild($name1);
$user1->appendChild($email1);
$users->appendChild($user1);
// 두 번째 <user> 요소 생성
$user2 = $dom->createElement('user');
$id2 = $dom->createElement('id', 2);
$name2 = $dom->createElement('name', 'Jane Doe');
$email2 = $dom->createElement('email', 'jane@example.com');
// <user> 요소에 <id>, <name>, <email> 추가
$user2->appendChild($id2);
$user2->appendChild($name2);
$user2->appendChild($email2);
$users->appendChild($user2);
// 생성된 XML 출력
echo $dom->saveXML();
?>
설명:
DOMDocument
: DOM 객체를 생성하고 XML 버전과 인코딩을 설정합니다.createElement()
: 새로운 XML 요소를 생성합니다.appendChild()
: 부모 요소에 자식 요소를 추가합니다.saveXML()
: 생성된 XML을 출력하거나 파일로 저장할 수 있습니다.
5. 보안 고려 사항
5.1 외부 엔티티 주입(XML External Entity, XXE) 방지
XML 파일을 처리할 때는 **외부 엔티티 주입 공격(XXE)**를 방지해야 합니다. 이를 위해 XML 파서에서 외부 엔티티 로드를 비활성화하는 것이 중요합니다.
SimpleXML에서 외부 엔티티 비활성화:
libxml_disable_entity_loader(true);
$xml = simplexml_load_file('example.xml');
DOMDocument에서 외부 엔티티 비활성화:
$dom = new DOMDocument();
$dom->resolveExternals = false;
$dom->load('example.xml');
5.2 입력 데이터 유효성 검사
XML 데이터를 처리할 때는 반드시 입력 데이터를 검증하고, 사용자의 입력이나 외부 파일에 대해 유효성 검사를 수행해야 합니다.
요약
PHP에서 XML 파서를 사용하여 XML 데이터를 파싱, 생성, 그리고 처리하는 방법에는 SimpleXML, DOMDocument, XML Parser 등 다양한 방법이 있습니다. SimpleXML은 사용이 간편하고 빠르게 XML 데이터를 처리할 수 있으며, DOMDocument는 XML 데이터를 트리 구조로 다루기에 적합하고, 더 복잡한 XML 처리를 지원합니다. XML Parser는 이벤트 기반으로 대용량 파일을 처리하는 데 적합합니다. XML 파싱 중 보안을 고려하여 XXE 공격을 방지하는 등의 조치를 취하는 것이 중요합니다.