2013-11-14 2 views
1

PHP 스크립트를 사용하여 내 jobs.xml 파일에서 하위를 삭제하려고합니다.는 PHP를 사용하여 xml에서 자식을 제거하는 데 도움이 필요합니다.

내 jobs.xml처럼 보이는 방법은 다음과 같습니다

나는이 사용자의 작업 ID 걸릴과에 제출하고 작업 ID를 가지고 이벤트 아이를 삭제 PHP 스크립트를 생성 한
<jobs> 
    <event jobid="1"> 
    <title>jobtitle</title> 
    <desc>description</desc> 
    <date>postdate</date> 
    </event> 
    <event jobid="2"> 
    <title>jobtitle</title> 
    <desc>description</desc> 
    <date>postdate</date> 
    </event> 
    <event jobid="3"> 
    <title>jobtitle</title> 
    <desc>description</desc> 
    <date>postdate</date> 
    </event> 
    </jobs> 

.

그러나 새 작업을 만들 때 새 작업 이벤트를 만들 때 $ jobid = $ xmlobj-> count() + 1;

나를 도와 줄 수 있습니까? 나는 PHP 스크립트를 사용하는 것을 선호하지만 자바 스크립트 역시 괜찮을 것이다.

편집 :

여기 삭제하는 내 코드의는 :

<?php 
    $jobs = simplexml_load_file('jobs.xml'); 
    $jobid = $_POST['jobid']; 
    foreach ($jobs->children() as $event) { 
    if($event->attributes()->jobid == $jobid) 
    { 
     $dom=dom_import_simplexml($event); 
    $dom->parentNode->removeChild($dom); 
    } 
    } 
    $jobs->asXML('jobs.xml'); 
    ?> 

답변

0

는 참고 :를 새로 생성 된 파일이에서만 작동합니다. 기존 파일은 next_jobid="N"을 루트 요소 <jobs>에 수동으로 추가해야합니다. 추가 개선에

에 오신 것을 환영합니다 :

class JobsXML 
{ 
    public function __construct($filename) 
    { 
     $this->filename = $filename; 
     $this->dom = new DOMDocument; 
     $this->dom->formatOutput = true; 
     @$this->dom->load($filename); 
     $this->xpath = new DOMXPath($this->dom); 

     if ($this->xpath->query('//jobs')->length == 0) { 
      $this->root = $this->dom->createElement('jobs'); 
      $this->root->setAttribute('next_jobid', 1); 
      $this->dom->appendChild($this->root); 
     } else { 
      $this->root = $this->xpath->query('//jobs')->item(0); 
     } 
    } 

    public function insertEvent($title, $desc, $date) 
    { 
     $next_jobid = $this->root->getAttribute('next_jobid'); 
     $event = $this->dom->createElement('event'); 
     $event->setAttribute('jobid', $next_jobid); 
     $event->appendChild($this->dom->createElement('title', $title)); 
     $event->appendChild($this->dom->createElement('desc', $desc)); 
     $event->appendChild($this->dom->createElement('date', $date)); 
     $this->root->appendChild($event); 
     $this->root->setAttribute('next_jobid', intval($next_jobid) + 1); 
    } 

    public function removeEvent($jobid) 
    { 
     foreach ($this->xpath->query("//event[@jobid=$jobid]") as $node) { 
      $node->parentNode->removeChild($node); 
     } 
    } 

    public function save() 
    { 
     $this->dom->save($this->filename); 
    } 
} 

삽입 이벤트 :

$jobs = new JobsXML('jobs.xml'); 
$jobs->insertEvent('jobtitle', 'description', 'postdate'); 
$jobs->save(); 

제거 이벤트 :

$jobs = new JobsXML('jobs.xml'); 
$jobs->removeEvent(1); 
$jobs->save(); 
+0

@Paulo. 마침내 코드를 작성할 시간이 생겨 필요한 변경을 할 수있었습니다. 그것의 일 벌금. 감사. –

+0

@MalavShah 환영합니다! 나는 너를 도울 수있어서 기뻐! :) –

0
$jobs = simplexml_load_file('jobs.xml'); 
$jobid = 1; 
foreach ($jobs->children() as $event) { 
    if($event->attributes()->jobid == $jobid){ 
     $dom=dom_import_simplexml($event); 
     $dom->parentNode->removeChild($dom); 
    } 
} 

echo $jobs->asXML(); 
+0

귀하의 코드 내 XML에서 이벤트를 삭제 나를 도왔다. 하지만 한 가지 더 문제가 있습니다. 새 작업을 만들 때 jobid = $ xmlobj-> count() + 1; 중복 된 jobid를 만듭니다. 마지막 이벤트의 jobid 값에 액세스하여 그 값을 증가시킬 수있는 방법이 있습니까? –

+0

전체 코드를 붙여 넣을 수 있습니까? –

관련 문제