php 입문 | XML 데이터의 이용 | 노드를 조작하기
단순히 XML 데이터를 꺼내 출력뿐만 아니라 XML 데이터를 여러가지 조작해야 하는 경우가 있을 것이다. 예를 들어, 새로운 노드를 추가하거나 이미있는 노드를 삭제하는 등의 조작이다. 이러한 노드의 편집 작업에 대해 알아보자.
노드의 값 조작
이는 매우 간단하다. 이미 노드를 지정하는 방법은 알고 있을 것이고, 그 지정된 노드에 새 값을 할당하면 된다. 예를 들어, 이전에 XML 데이터에서 첫 번째 <data>
의 <name>
값을 변경하고 싶다면, 아래와 같이 하면 된다.
$xml->data[0]->name = "값";
이렇게 하면 첫번째 (즉, 0번째) <data>
의 <name>
값을 새로 변경이 된다. 만약, name이라고 노드가 없다면 새로 추가된다. (다음에 addChild라는 메소드를 설명하겠지만, 실은 이런 식으로 노드의 이름을 지정하고 값을 설정하면 addChild를 사용하지 않고도 노드를 추가할 수 있다.)
노드 추가
노드의 추가는 추가할 노드에서 “addChild"라는 메소드를 호출한다. 이는 다음과 같다.
노드->addChild(이름, 값);
첫번째 인수에 노드의 이름을, 두번째 인수에 설정되는 값을 각각 지정한다. 또한 세번째 인수에 네임스페이스를 지정하여 “OO라는 곳에 노드를 추가"와 같이 추가할 위치를 지정할 수도 있다. 아무튼, 우선은 첫번째, 두번째 인수만 알면 노드의 추가는 쉽게 할 수 있게 될 것이다.
예를 들어, 앞의 XML 데이터에서 첫 번째 <data>
에 <maker>
라는 노드를 추가하고 싶다면 다음과 같이 하면 된다.
$xml->data[0]->addChild('maker', 'microsoft');
노드 삭제
사실 삭제는 전용 메소드가 없고, 해당 노드의 속성을 unset 해 버리면 된다. 예를 들어, 앞의 XML 데이터에서 첫 번째 <data>
를 삭제하고 싶다면 아래와 같이 하면 된다.
unset ($xml->data[o]);
속성(attribute) 조작
노드에는 값 외에 속성이라는 것도 있다. 예를 들어, 값은 <data>hoge</data>
라는 태그가 있을 경우 “hoge"가 값이 된다. 이와는 별도로 <data name="a">hoge</data>
와 같이 <data>
태그 내에 속성을 XML에서는 지정할 수 있다.
이 속성은 “addAttribute"라는 메소드로 쉽게 추가할 수 있다.
노드->addAttribute(이름, 값);
이런 식으로 하면 된다. 매우 간단하지만, 그 다른 값에 대한 갱신 또는 삭제에 대한 전용 메소드는 포함되어 있지 않다. “attributes"라는 메소드에서 노드에 포함되어 있는 모든 속성을 SimpleXMLElement으로 추출할 수 있지만, 이미 있는 속성을 삭제하는 등의 기능은 SimpleXML에는 없다.
그럼 노드와 속성을 조작하는 예제를 보도록 하자.
<?php
$arr = array('one', 'two', 'three');
$xml = new SimpleXMLElement("data.xml", 0, true);
for($i = 0; $i < count($arr); $i++) {
$xml->data[$i]->version = $arr[$i];
unset($xml->data[$i]->price);
$newdata = $xml->addChild("otherdata", "");
$newdata->addAttribute("number", $i + 1);
$newdata->addChild("name", $arr[$i]);
}
header('content-type:text/xml;charset=utf-8');
echo $xml->asXML();
이전의 data.xml 파일을 로드하고, 그 내용을 편집하여 새로운 노드를 추가하고 XML 데이터로 출력한다. 여기서 <data>
에서 <version>
값을 변경하고, <price>
를 제거한다. 또한 새롭게 <otherdata>
라는 노드를 만들어서 number 속성과 name 노드를 추가한다.
수정된 SimpleXMLElement는 “asXML"라는 메소드를 사용해 XML 소스 코드로 출력한다. 이 asXML 메소드에 인수 등을 붙이지 않고 호출하게 되면, XML 소스 코드를 텍스트 값으로 반환한다. 수정한 XML 내용을 그대로 표시하는데 편리한다.