简体   繁体   English

需要帮助使用php删除xml中的子级

[英]need help on removing child in xml using php

I am trying to delete child from my jobs.xml file using a php script. 我正在尝试使用php脚本从我的job.xml文件中删除子级。

the way my jobs.xml looks like is : 我的jobs.xml看起来是这样的:

    <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>

I have created a php script where I take jobid from the user and on submit and delete the event child who has that jobid. 我创建了一个php脚本,在其中我从用户那里获取Jobid,然后提交并删除具有该JobID的事件子级。

but the problem is that when i create a new job i get a duplicate jobid as when I create new job event I use $jobid = $xmlobj->count() + 1; 但是问题是当我创建一个新工作时,我得到的工作ID重复,就像我创建新工作事件时一样,我使用$ jobid = $ xmlobj-> count()+ 1;。

Could some one help me in this. 有人可以帮助我吗? I prefer to use php script but java script will be fine too. 我更喜欢使用php脚本,但是java脚本也可以。

EDIT : 编辑:

Here's my code to delete : 这是我要删除的代码:

    <?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');
    ?>
$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();

Please note: this only work for newly created files. 请注意:这仅适用于新创建的文件。 Existing files will need to manual add next_jobid="N" on the root element <jobs> . 现有文件将需要在根元素<jobs>上手动添加next_jobid="N"

Welcome to further improvements: 欢迎进一步改进:

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);
    }
}

Inserting event: 插入事件:

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

Removing event: 移除事件:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM