2012-07-15 1 views
0

XML의 특정 위치 끝 부분에 데이터를 추가하려고합니다.PHP를 사용하여 XML의 특정 스팟 끝 부분에 자식 추가

내 XML은 훨씬 길지만, 예를 들어 데이터를 "삭제"섹션 끝에 추가하려고합니다. "Total Tickets"의 끝 부분에 다른 데이터를 추가 할 것입니다. 그러나 어떻게하면 첫 번째 자식의 끝에 데이터를 추가하는 방법을 알아낼 수 있는지, 나머지는 파악할 수 있습니다.

<report> 
<sets> 
<set> 
    <legend>Delete</legend> 
    <values> 
    <value date="2012-06-24" data="9"/> 
    <value date="2012-06-25" data="17"/> 
    <value date="2012-06-26" data="15"/> 
    <value date="2012-06-27" data="10"/> 
    <value date="2012-06-28" data="8"/> 
    </values> 
</set> 
    <set> 
    <legend>Total Tickets</legend> 
    <values> 
    <value date="2012-06-24" data="412"/> 
    <value date="2012-06-25" data="416"/> 
    <value date="2012-06-26" data="423"/> 
    <value date="2012-06-27" data="405"/> 
    <value date="2012-06-28" data="280"/> 
    </values> 
</set> 
</sets> 
</report> 

다음은 결과를 확인하기 위해 작성한 테스트 스크립트입니다.

:이 경우, 나는 전설 목록의 마지막에 '12345'의 속성 데이터 요소 '값'을 추가하려고 내가 할

<?php 

$doc = new DOMDocument; 

$doc->load('result.xml'); 

$test = $doc->getElementsByTagName("legend")->item(0); 

echo $test->nodeValue.PHP_EOL; //should print Delete 

if("Delete" == $test->nodeValue) 
{ 

    $newElement = $doc->createElement('value'); 
    $theAttribute = $doc->createAttribute('date'); 

    $theAttribute->value='12345'; 

    $newElement->appendChild($theAttribute); 

    $doc->appendChild($newElement); 

} 


echo $doc->saveXML(); 
?> 

결과 "를 삭제하는 것은"이것이다

<report> 
<sets> 
<set> 
    <legend>Delete</legend> 
    <values> 
    <value date="2012-06-24" data="9"/> 
    <value date="2012-06-25" data="17"/> 
    <value date="2012-06-26" data="15"/> 
    <value date="2012-06-27" data="10"/> 
    <value date="2012-06-28" data="8"/> 
    </values> 
</set> 
    <set> 
    <legend>Total Tickets</legend> 
    <values> 

    <value date="2012-06-24" data="412"/> 
    <value date="2012-06-25" data="416"/> 
    <value date="2012-06-26" data="423"/> 
    <value date="2012-06-27" data="405"/> 
    <value date="2012-06-28" data="280"/> 
    </values> 
</set> 
</sets> 
</report> 
<value date="12345"/> 

내가 노력하고있어이 데이터는이 대신로 표시하세요 :

<report> 
<sets> 
<set> 
    <legend>Delete</legend> 
    <values> 
    <value date="2012-06-24" data="9"/> 
    <value date="2012-06-25" data="17"/> 
    <value date="2012-06-26" data="15"/> 
    <value date="2012-06-27" data="10"/> 
    <value date="2012-06-28" data="8"/> 
    <value date="12345"/> 
    </values> 
</set> 

내가 데이터를 특정 지점 대신 XML의 맨 마지막에 추가 될 얻을 수있는 방법 확실하지.

감사합니다.

답변

0

이 시도 :

원본 XML 파일 ('testFile.xml'로 저장) :

<?xml version="1.0" encoding="utf-8"?> 
<report> 
    <sets> 
     <set> 
      <legend>Delete</legend> 
      <values> 
       <value date="2012-06-24" data="9"/> 
       <value date="2012-06-25" data="17"/> 
       <value date="2012-06-26" data="15"/> 
       <value date="2012-06-27" data="10"/> 
       <value date="2012-06-28" data="8"/> 
      </values> 
     </set> 
     <set> 
      <legend>Total Tickets</legend> 
      <values> 
       <value date="2012-06-24" data="412"/> 
       <value date="2012-06-25" data="416"/> 
       <value date="2012-06-26" data="423"/> 
       <value date="2012-06-27" data="405"/> 
       <value date="2012-06-28" data="280"/> 
      </values> 
     </set> 
    </sets> 
</report> 

PHP를 코드 :

<?php 
$dom = new DomDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 

// load the xml file 
$dom->load('testFile.xml', LIBXML_NOBLANKS); 
$xpath = new DOMXPath($dom); 

// prepare the xpath query to find the "values" node corresponding the 
// "Delete" legend 
$nodes = $xpath->query("//set[legend='Delete']/values"); 

// if found, append the new "value" node 
if($nodes->length) { 
    $vNode = $dom->createElement('value'); 
    $vNodeAttr = $dom->createAttribute('date'); 
    $vNodeAttr->value = '12345'; 

    $vNode->appendChild($vNodeAttr); 

    // append to "values" 
    $nodes->item(0)->appendChild($vNode); 
} 

// i'm not saving it, just echo'ing 
header('content-type: text/xml'); 
echo $dom->saveXML(); 
?> 

최종 XML 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<report> 
    <sets> 
    <set> 
     <legend>Delete</legend> 
     <values> 
     <value date="2012-06-24" data="9"/> 
     <value date="2012-06-25" data="17"/> 
     <value date="2012-06-26" data="15"/> 
     <value date="2012-06-27" data="10"/> 
     <value date="2012-06-28" data="8"/> 
     <!--Node appended here--> 
     <value date="12345"/> 
     </values> 
    </set> 
    <set> 
     <legend>Total Tickets</legend> 
     <values> 
     <value date="2012-06-24" data="412"/> 
     <value date="2012-06-25" data="416"/> 
     <value date="2012-06-26" data="423"/> 
     <value date="2012-06-27" data="405"/> 
     <value date="2012-06-28" data="280"/> 
     </values> 
    </set> 
    </sets> 
</report> 

희망이 도움이됩니다.

+0

완벽! 감사! – msg04

관련 문제