实现tp5命令操作Xml文件

一. tp5实现行代码

  1. 命令行执行文件


namespace app\command\abutment;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;

class CreateUser extends Command
{
     
    protected function configure()
    {
     
        $this
            // 命令的名字("think" 后面的部分)
            ->setName('app:create-user')
            // 配置一个参数
            ->addArgument('name', //参数名
             Argument::REQUIRED, //参数类型
             'Do you like ThinkPHP') //参数描述
            // 配置一个选项
            ->addOption(
		        'animals',  //选项名
		        null,	
		        Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY,//选项类型
		        'Which animals do you like?',//选项描述
		        array('cat', 'dog')
		    )
            // 运行 "php think list" 时的简短描述
            ->setDescription('Creates new users.')
            // 运行命令时使用 "--help" 选项时的完整命令描述
            ->setHelp("This command allows you to create users...");
    }

    protected function execute(Input $input, Output $output)
    {
     
        //命令实现部分
    }
}
  1. 添加执行文路径件到command.php
return [
	//命名空间\类名
    'app\command\abutment\AbutSiteDb',
];
  1. 关键点解读

参数类型 说明

Argument::REQUIRED 参数必填。如果不提供,则命令不运
Argument::OPTIONAL 参数可选,因此可以忽略
Argument::IS_ARRAY 参数可以包含任意多个值。因此,它必须使用在参数列表中的最后一个

选项类型 说明

Option::VALUE_IS_ARRAY 此选项可接收多个值 eg:–dir=/foo --dir=/bar
Option::VALUE_NONE 此选项不接受输入的值 eg:–key
Option::VALUE_REQUIRED 此选项的值必填,但选项本身仍然是可选的 eg:–num=7
Option::VALUE_OPTIONAL 此选项的值可有可无 eg:–key 或 --key=value

二. php代码操作Xml文件

  1. 相关属性和方法
    DOMDocument 属性:

Attributes存储节点的属性列表(只读)

childNodes存储节点的子节点列表(只读)

dataType返回此节点的数据类型

Definition以DTD或XML模式给出的节点的定义(只读)

Doctype 指定文档类型节点(只读)

documentElement返回文档的根元素(可读写)

firstChild返回当前节点的第一个子节点(只读)

Implementation返回XMLDOMImplementation对象

lastChild返回当前节点最后一个子节点(只读)

nextSibling返回当前节点的下一个兄弟节点(只读)

nodeName返回节点的名字(只读)

nodeType返回节点的类型(只读)

nodeTypedValue存储节点值(可读写)

nodeValue返回节点的文本(可读写)

ownerDocument返回包含此节点的根文档(只读)

parentNode返回父节点(只读)

Parsed 返回此节点及其子节点是否已经被解析(只读)

Prefix 返回名称空间前缀(只读)

preserveWhiteSpace指定是否保留空白(可读写)

previousSibling返回此节点的前一个兄弟节点(只读)

Text 返回此节点及其后代的文本内容(可读写)

url 返回最近载入的XML文档的URL(只读)

Xml 返回节点及其后代的XML表示(只读)

DOMDocument 方法:

appendChild为当前节点添加一个新的子节点,放在最后的子节点后

cloneNode返回当前节点的拷贝

createAttribute创建新的属性

createCDATASection创建包括给定数据的CDATA段

createComment创建一个注释节点

createDocumentFragment创建DocumentFragment对象

createElement_x创建一个元素节点

createEntityReference创建EntityReference对象

createNode创建给定类型,名字和命名空间的节点

createPorcessingInstruction创建操作指令节点

createTextNode创建包括给定数据的文本节点

getElementsByTagName返回指定名字的元素集合

hasChildNodes返回当前节点是否有子节点

insertBefore在指定节点前插入子节点

Load 导入指定位置的XML文档

loadXML 导入指定字符串的XML文档

removeChild从子结点列表中删除指定的子节点

replaceChild从子节点列表中替换指定的子节点

Save 把XML文件存到指定节点

selectNodes对节点进行指定的匹配,并返回匹配节点列表

selectSingleNode对节点进行指定的匹配,并返回第一个匹配节点

transformNode使用指定的样式表对节点及其后代进行转换

TbConfig.xml 操作demo

AbutSiteTb命令




namespace app\command\abutment;


use DOMDocument;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;

class AbutSiteTb extends Command
{
     
    protected function configure()
    {
     
        $this->setName('AbutSiteTb')
            ->setDescription(' set file TbConfig')
            ->addOption(
                'create',
                null,
                Option::VALUE_NONE,
                'create TbConfig xml'
            )
            ->addOption(
                'add',
                null,
                Option::VALUE_REQUIRED,
                'add TbConfig xml Object',
                ''
            )
            ->addOption(
                'del',
                null,
                Option::VALUE_REQUIRED,
                'delete TbConfig xml Object',
                ''
            )
            ->addOption(
                'sel',
                null,
                Option::VALUE_REQUIRED,
                'select TbConfig xml Object',
                ''
            )
            ->addOption(
                'selAll',
                null,
                Option::VALUE_NONE,
                'select All TbConfig xml Object'
            );

    }

    protected function execute(Input $input, Output $output)
    {
        //create
        if($input->hasOption('create')){
     
            $this->createTbXml($input,$output);
        }

        //add
        if($input->hasOption('add')){
     
            $op = $input->getOption('add');
            $this->addOject($input,$output,$op);
        }

        //delete
        if($input->hasOption('del')){
     
            $op = $input->getOption('del');
            $this->deleteOject($input,$output,$op);
        }

        //selAll
        if($input->hasOption('selAll')){
     
            $this->selectOjectAll($input,$output);
        }

        //sel
        if($input->hasOption('sel')){
     
            $op = $input->getOption('sel');
            $this->selectOject($input,$output,$op);
        }

    }

    //--create功能实现函数
    private function createTbXml(Input $input,Output $output){
     

        $output->writeln('the value is create' );

        //创建一个新的 DOM文档
        $dom = new DomDocument();
        //在根节点创建 abutDB标签
        $abutTB = $dom->createElement('abutTB');
        $dom->appendChild($abutTB);

        //输出 XML数据
        $output->writeln($dom->saveXML());

        //将 XML数据写入文件
        $fp = fopen('TbConfig.xml', 'w');
        if(fwrite($fp, $dom->saveXML()))
            $output->writeln('create TbConfig successful');
        else
            $output->writeln('create TbConfig error');

        fclose($fp);

    }

    //--add功能实现函数
    private function addOject(Input $input,Output $output, $value){
     

        $output->writeln('the Object is '.$value);
        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        $addDom = $dom->getElementsByTagName($value); //获取将要添加的节点

        if (count($addDom) === 0){
     
            //在根标签下创建子标签
            $obj = $dom->createElement($value);
            $rootDom->appendChild($obj);

            if($dom->save('TbConfig.xml'))
                $output->writeln('add TbConfig successful');
            else
                $output->writeln('add TbConfig error');
        }else{
     
            $output->writeln($value.' alreadly exist');
        }

    }

    //--del功能实现函数
    private function deleteOject(Input $input,Output $output, $value){
     

        $output->writeln('the Object is '.$value);
        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        $delDom = $rootDom->getElementsByTagName($value); //获取删除节点

        if (count($delDom) > 0){
     
            //在根标签下删除子节点
            foreach($delDom as $d){
     
                $rootDom->removeChild($d);
            }

            if($dom->save('TbConfig.xml'))
                $output->writeln('del TbConfig object '.$value.' successful');
            else
                $output->writeln('del TbConfig object '.$value.'error');
        }else{
     
            $output->writeln($value.' not exist');
        }

    }

    //--selAll功能实现函数
    private function selectOjectAll(Input $input,Output $output){
     

        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        if (count($rootDom->childNodes) > 0){
     
            foreach ($rootDom->childNodes as $d){
     
                $output->writeln($d->tagName);
            }
        }else{
     
            $output->writeln(' no childNodes');
        }
    }

    //--sel功能实现函数
    private function selectOject(Input $input,Output $output, $value){
     

        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $showDon =  $dom ->getElementsByTagName($value);
        foreach ($showDon as $d){
     
            $output->writeln(dump($d));
        }
    }

}

AbutSiteTbItem命令




namespace app\command\abutment;


use DOMDocument;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;

class AbutSiteTbItem extends Command
{
     
    protected function configure()
    {
     
        $this->setName('AbutSiteTbItem')
            ->setDescription(' set file TbConfig Item')
            ->addOption(
                'pItem',
                null,
                Option::VALUE_REQUIRED,
                'the item will change',
                ''
            )
            ->addOption(
                'itemValue',
                null,
                Option::VALUE_REQUIRED,
                'the item will change',
                ''
            )
            ->addOption(
                'addItem',
                null,
                Option::VALUE_REQUIRED,
                'add TbConfig xml Object Item',
                ''
            )
            ->addOption(
                'delItem',
                null,
                Option::VALUE_REQUIRED,
                'delete TbConfig xml Object Item',
                ''
            )
            ->addOption(
                'selItem',
                null,
                Option::VALUE_REQUIRED,
                'select TbConfig xml Object Item',
                ''
            )
            ->addOption(
                'cv',
                null,
                Option::VALUE_REQUIRED,
                'change TbConfig xml Object Item value',
                ''
            );
    }

    protected function execute(Input $input, Output $output)
    {
     
        //add
        if($input->hasOption('pItem') &&  $input->hasOption('addItem') &&  $input->hasOption('itemValue')){
     
            $item = $input->getOption('pItem');
            $op = $input->getOption('addItem');
            $value = $input->getOption('itemValue');
            $this->addItem($input,$output,$item,$op,$value);
        }

        //sel
        if($input->hasOption('selItem')){
     
            $value = $input->getOption('selItem');
            $this->selItem($input,$output,$value);
        }

        //del
        if($input->hasOption('pItem') &&  $input->hasOption('delItem')){
     
            $item = $input->getOption('pItem');
            $op = $input->getOption('delItem');
            $this->delItem($input,$output,$item,$op);
        }

        //cv
        if($input->hasOption('pItem') &&  $input->hasOption('cv') &&  $input->hasOption('itemValue')){
     
            $item = $input->getOption('pItem');
            $op = $input->getOption('cv');
            $value = $input->getOption('itemValue');
            $this->cvItemValue($input,$output,$item,$op, $value);
        }

    }

    //--addItem功能实现函数
    private function addItem(Input $input,Output $output, $item, $op, $value){
     
        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        $parentDon =  $rootDom ->getElementsByTagName($item)->item(0);

        if ($parentDon ){
     
            //属性存在性检测
            foreach ($parentDon->childNodes as $p){
     
                if ($p->tagName == $op){
     
                    $output->writeln( $op." exist in ".$item );
                    exit();
                }
            }
            //属性添加
            $obj = $dom->createElement($op);
            $obj_value = $dom->createTextNode($value);
            $obj->appendChild($obj_value);
            $status = $parentDon->appendChild($obj);

            if ($status){
     
                if($dom->save('TbConfig.xml'))
                    $output->writeln('add TbConfig Objiect item successful');
                else
                    $output->writeln('add TbConfig Objiect item error');
            }else{
     
                $output->writeln( ' add error');
            }
        }else{
     
            $output->writeln( $item." node is not exist " );
        }

    }

    //--selitem功能实现函数
    private function selItem(Input $input,Output $output, $value){
     
        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        $parentDon =  $rootDom ->getElementsByTagName($value)->item(0);
        //将结果数组化
        if ($parentDon){
     
            $res = [];
            foreach ($parentDon->childNodes as  $p){
     
                $res[$p->nodeName] = $p->nodeValue;
            }
            $output->writeln(dump($res));
        }else{
     
            $output->writeln( $value." node is not exist " );
        }
    }

    //--delitem功能实现函数
    private function delItem(Input $input,Output $output, $item, $op){
     
        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        $delDon =  $rootDom ->getElementsByTagName($op);
        $delParentDom =  $rootDom ->getElementsByTagName($item)->item(0);
        if (count($delDon) > 0 ){
     
            $status = 0;
            $have = 0;
            foreach ($delDon as $v){
     
                $parentDom=$v->parentNode;
                if ($parentDom->nodeName == $item){
     
                    $have = 1;
                    $status = $delParentDom->removeChild($v);
                }
            }
            if (!$have){
     
                $output->writeln('The '.$item.' is not include '.$op.' .');
                exit();
            }

            if ($status){
     
                if($dom->save('TbConfig.xml'))
                    $output->writeln('from '.$item.' delete '.$op.'  item successful');
                else
                    $output->writeln('from '.$item.' delete '.$op.'  item error');
            }
        }else{
     
            $output->writeln( $op." node is not exist " );
        }

    }

    //--cv功能实现函数
    private function cvItemValue(Input $input,Output $output, $item, $op , $value){
     
        //创建一个新的 DOM文档
        $dom = new DomDocument();
        $dom->load('TbConfig.xml'); //读取 XML数据
        $rootDom = $dom->documentElement; //获取根节点
        $cvDon =  $rootDom ->getElementsByTagName($op);
        if (count($cvDon) > 0 ){
     
            $have = 0;
            foreach ($cvDon as $v){
     
                $parentDom=$v->parentNode;
                if ($parentDom->nodeName == $item){
     
                    $have = 1;
                    $v->nodeValue = $value;
                }
            }
            if (!$have){
     
                $output->writeln('The '.$item.' is not include '.$op.' .');
                exit();
            }

            if($dom->save('TbConfig.xml'))
                 $output->writeln('from '.$item.' change '.$op.'  item successful');
            else
                 $output->writeln('from '.$item.' change '.$op.'  item error');

        }else{
     
            $output->writeln( $op." node is not exist " );
        }

    }

}

你可能感兴趣的:(php)