PHP XML DOM
PHP XML DOM : DOM을 사용한 XML 파싱 및 처리
PHP의 DOM (Document Object Model) 확장은 XML 데이터를 DOM 트리로 구문 분석하고, 데이터를 읽고, 수정하고, 생성할 수 있게 해줍니다. DOM은 문서 구조를 기반으로 XML 요소와 속성에 접근할 수 있는 강력한 도구입니다. DOM을 사용하면 XML 데이터를 트리 구조로 표현하여, 각각의 노드와 요소를 쉽게 조작할 수 있습니다.
이 가이드에서는 PHP에서 DOM을 사용하여 XML 데이터를 처리하는 방법을 설명하고, 읽기, 수정, 추가, 삭제와 같은 주요 기능을 예제를 통해 소개합니다.
1. DOM으로 XML 데이터 읽기
DOM을 사용하면 XML 파일을 DOM 트리로 읽어들여, 각 요소와 속성에 접근할 수 있습니다.
예시: DOM으로 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>
DOM을 사용하여 XML 데이터 읽기
<?php
// DOMDocument 객체 생성
$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 데이터를 파싱할 DOMDocument 객체를 생성합니다.load()
: XML 파일을 DOM 트리 구조로 로드합니다.getElementsByTagName()
: 특정 태그 이름을 가진 요소를 선택합니다.nodeValue
: 선택한 XML 요소의 값을 가져옵니다.
2. DOM으로 XML 데이터 수정
DOM을 사용하면 XML 데이터를 수정할 수 있습니다. 특정 요소를 찾아서 해당 값을 변경할 수 있습니다.
예시: DOM으로 XML 데이터 수정
<?php
// DOMDocument 객체 생성
$dom = new DOMDocument();
// XML 파일 로드
$dom->load('example.xml');
// 첫 번째 사용자의 이메일 수정
$users = $dom->getElementsByTagName('user');
$firstUser = $users->item(0); // 첫 번째 <user> 요소
$emailElement = $firstUser->getElementsByTagName('email')->item(0);
$emailElement->nodeValue = 'john_new@example.com';
// 수정된 XML을 출력
echo $dom->saveXML();
// 수정된 XML을 파일로 저장
$dom->save('example_updated.xml');
?>
설명:
item()
: 특정 인덱스의 요소를 선택합니다.nodeValue
: XML 요소의 값을 수정할 수 있습니다.saveXML()
: 수정된 XML 데이터를 출력하거나 파일로 저장할 수 있습니다.
3. DOM으로 XML 데이터 추가
XML 파일에 새로운 요소를 추가하려면 DOM을 사용해 새로운 노드를 생성하고, 이를 트리에 추가할 수 있습니다.
예시: DOM으로 XML 데이터 추가
<?php
// DOMDocument 객체 생성
$dom = new DOMDocument();
// XML 파일 로드
$dom->load('example.xml');
// 새로운 사용자 추가
$users = $dom->getElementsByTagName('users')->item(0);
// <user> 요소 생성
$newUser = $dom->createElement('user');
// <id>, <name>, <email> 요소 생성 및 추가
$newId = $dom->createElement('id', 3);
$newName = $dom->createElement('name', 'Sam Smith');
$newEmail = $dom->createElement('email', 'sam@example.com');
$newUser->appendChild($newId);
$newUser->appendChild($newName);
$newUser->appendChild($newEmail);
// <users> 요소에 새로운 <user> 추가
$users->appendChild($newUser);
// 수정된 XML 출력
echo $dom->saveXML();
// 수정된 XML 파일로 저장
$dom->save('example_with_new_user.xml');
?>
설명:
createElement()
: 새로운 XML 요소를 생성합니다.appendChild()
: 부모 요소에 자식 요소를 추가합니다.save()
: 새로운 데이터를 포함한 XML을 파일로 저장할 수 있습니다.
4. DOM으로 XML 속성 처리
DOM을 사용하면 **XML 속성(attribute)**도 쉽게 읽고 수정할 수 있습니다.
예시: XML 속성 읽기 및 수정
XML 파일 (example_with_attributes.xml
)
<users>
<user id="1">
<name>John Doe</name>
<email>john@example.com</email>
</user>
<user id="2">
<name>Jane Doe</name>
<email>jane@example.com</email>
</user>
</users>
DOM으로 속성 읽기 및 수정
<?php
// DOMDocument 객체 생성
$dom = new DOMDocument();
// XML 파일 로드
$dom->load('example_with_attributes.xml');
// 첫 번째 사용자의 id 속성 값 읽기
$user = $dom->getElementsByTagName('user')->item(0);
$id = $user->getAttribute('id');
echo "First user's ID: $id<br>";
// 첫 번째 사용자의 id 속성 수정
$user->setAttribute('id', '10');
// 수정된 XML 출력
echo $dom->saveXML();
?>
설명:
getAttribute()
: 특정 XML 요소의 속성 값을 읽습니다.setAttribute()
: XML 속성 값을 수정합니다.
5. DOM으로 XML 데이터 삭제
DOM을 사용하면 XML 요소나 속성을 삭제할 수 있습니다.
예시: DOM으로 XML 데이터 삭제
<?php
// DOMDocument 객체 생성
$dom = new DOMDocument();
// XML 파일 로드
$dom->load('example.xml');
// 첫 번째 사용자의 <email> 요소 삭제
$users = $dom->getElementsByTagName('user');
$firstUser = $users->item(0);
$emailElement = $firstUser->getElementsByTagName('email')->item(0);
$firstUser->removeChild($emailElement);
// 수정된 XML 출력
echo $dom->saveXML();
?>
설명:
removeChild()
: 특정 요소를 삭제할 수 있습니다. 부모 요소에서 자식 요소를 제거하는 방식으로 삭제가 이루어집니다.
6. DOM으로 XML 네임스페이스 처리
XML 문서에서 네임스페이스를 사용하는 경우, DOM을 사용해 네임스페이스를 포함한 XML 데이터를 처리할 수 있습니다.
예시: XML 네임스페이스 처리
XML 파일 (example_with_namespace.xml
)
<users xmlns:ns="<http://example.com/ns>">
<ns:user>
<id>1</id>
<name>John Doe</name>
</ns:user>
<ns:user>
<id>2</id>
<name>Jane Doe</name>
</ns:user>
</users>
DOM으로 네임스페이스가 포함된 XML 데이터 처리
<?php
// DOMDocument 객체 생성
$dom = new DOMDocument();
// XML 파일 로드
$dom->load('example_with_namespace.xml');
// 네임스페이스 등록
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('ns', '<http://example.com/ns>');
// 네임스페이스 내의 <user> 요소 선택
$users = $xpath->query('//ns:user');
// 각 사용자 정보 출력
foreach ($users as $user) {
$id = $user->getElementsByTagName('id')[0]->nodeValue;
$name = $user->getElementsByTagName('name')[0]->nodeValue;
echo "ID: $id<br>";
echo "Name: $name<br><br>";
}
?>
설명:
DOMXPath
: 네임스페이스와 함께 XML 데이터를 쿼리할 수 있는 객체입니다.registerNamespace()
: 특정 네임스페이스를 등록합니다.query()
: XPath 표현식을 사용하여 네임스페이스를 포함한 요소를 선택합니다.
7. 보안 고려 사항
7.1 외부 엔티티 주입(XML External Entity, XXE) 방지
XML 데이터를 처리할 때는 외부 엔티티 주입(XXE) 공격을 방
지해야 합니다. DOMDocument를 사용할 때 외부 엔티티 로드를 비활성화할 수 있습니다.
$dom = new DOMDocument();
$dom->resolveExternals = false; // 외부 엔티티 로드 방지
$dom->load('example.xml');
7.2 입력 데이터 유효성 검사
XML 데이터를 처리하기 전에 입력 데이터에 대한 유효성 검사를 수행하는 것이 중요합니다. 외부 XML 파일이나 사용자 입력을 기반으로 XML 데이터를 처리할 때는 항상 안전성을 검토해야 합니다.
요약
PHP의 DOM을 사용하면 XML 데이터를 트리 구조로 처리하여, 읽기, 수정, 추가, 삭제 작업을 쉽게 수행할 수 있습니다. DOM은 네임스페이스를 포함한 복잡한 XML 데이터를 처리하는 데도 적합하며, 속성이나 텍스트 노드에 쉽게 접근할 수 있습니다. DOM을 사용한 XML 처리는 매우 강력하고 유연하지만, XML 데이터를 다룰 때는 보안 문제를 고려하여 외부 엔티티 주입(XXE) 공격을 방지하는 것이 중요합니다.