xml读写

框架里如何输出yii2中是

    public function actionQihuAsk(): array
    {
        Yii::$app->response->formatters[Response::FORMAT_XML] = [
            'class' => XmlResponseFormatter::class,
            'contentType' => 'application/xml',
            'encoding' => 'UTF-8',
            'rootTag' => 'DOCUMENT',
            'itemTag' => 'item',
        ];
        Yii::$app->response->format = Response::FORMAT_XML;

        $d1 = Yii::$app->request->get('d1');
        $d2 = Yii::$app->request->get('d2');

        $d1 = is_numeric($d1) ? (string)$d1 : date('Ymd');
        $d2 = is_numeric($d2) ? (string)$d2 : date('Ymd');

        $int_d1 = (int)$d1;
        $int_d2 = (int)$d2;

        if ($int_d1 > $int_d2) {
            return ['err' => '参数错误'];
        }
        if ($int_d1 > 99999999 || $int_d1 < 10000000) {
            return ['err' => '参数超出范围'];
        }
        if ($int_d2 > 99999999 || $int_d2 < 10000000) {
            return ['err' => '参数超出范围'];
        }

        $d1 = substr_replace($d1, '-', 4, 0);
        $d1 = substr_replace($d1, '-', -2, 0);
        $d2 = substr_replace($d2, '-', 4, 0);
        $d2 = substr_replace($d2, '-', -2, 0);

        if (strtotime("$d2 23:59:59") - strtotime("$d1 23:59:59") > 14*7*24*60*60) {
            return ['err' => '最长时间间隔不能超过 14 周'];
        }

        $result = (new Query())->from(News::tableName())
            ->where([
                'stage' => '发布',
                'category_id' => (new Query())->from(Category::tableName())
//                    ->where(['title' => '精选问答'])
                    ->where(['OR',['title' => '精选问答'],['title'=>"拆迁问答"]])
                    ->select('id'),
            ])
            ->andWhere(['between', 'created_at',  "$d1 00:00:00", "$d2 23:59:59"])
            ->select(['id', 'title', 'abstract', 'cover_image'])
            ->orderBy('id DESC')
            ->all();

        $url_base = Url::base(true);

        return array_map(fn(array $one): array => [
            'key' => $one['title'],
            'display' => [
                'title' => $one['title'],
                'content' => $one['abstract'] ?? '',
                'pic' => isset($one['cover_image']) ? $one['cover_image'] . '?imageMogr2/thumbnail/800x/format/jpg/quality/98' : '',
                'pcurl' => $url_base . '/news/' . $one['id'] . '?utm_source=360_ask',
                'showtxt' => '在明律师',
                'showurl' => $url_base . '/',
                'wapurl' => $url_base . '/news/' . $one['id'] . '?utm_source=360_ask',
                'logopic' => $url_base . '/favicon.ico',
            ],
        ], $result);
    }

但是yii2中无法做两个重复的节点  会被覆盖掉的

所以要使用原生方法

        // 实例化domdocument对象
        $doc = new \DomDocument('1.0',"utf-8");
        $doc->formatOutput=true;
        // 创建根节点
        $root = $doc->createElement('urlset');
        $root = $doc->appendChild($root);
        foreach($results as $one){ // 所有文章
            if(!empty($one['details'])) {
                // url
                $occ = $doc -> createElement('url');  //创建元素
                $occ = $root -> appendChild($occ);  //加入元素

                // loc
                $child = $doc -> createElement('loc');  //创建元素
                $child = $occ -> appendChild($child);  //加入值
                $locvalue = "https://www.zaimingchaiqian.com/news/".$one['id'];
                $value = $doc -> createTextNode($locvalue);
                $child -> appendChild($value);

                // changefreq
                $child = $doc -> createElement('changefreq');
                $child = $occ -> appendChild($child);
                $fieldvalue = 'always';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // priority
                $child = $doc -> createElement('priority');
                $child = $occ -> appendChild($child);
                $fieldvalue = '1.0';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // data
                $occ1 = $doc -> createElement('data');  //创建元素
                $occ1 = $occ -> appendChild($occ1);  //加入元素

                // display
                $occ2 = $doc -> createElement('display');  //创建元素
                $occ2 = $occ1 -> appendChild($occ2);  //加入元素

                // data_state
                $child = $doc -> createElement('data_state');
                $child = $occ2 -> appendChild($child);
                $fieldvalue = '1';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // key
                $child = $doc -> createElement('key');
                $child = $occ2 -> appendChild($child);
                $fieldvalue = $one['title'];
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // title
                $child = $doc -> createElement('title');
                $child = $occ2 -> appendChild($child);
                $fieldvalue = $one['title'];
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // abstract
                $child = $doc -> createElement('abstract');
                $child = $occ2 -> appendChild($child);
                $fieldvalue = $one['abstract'] ? $one['abstract'] : '';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // image
                $child = $doc -> createElement('image');
                $child = $occ2 -> appendChild($child);
                $fieldvalue = $one['cover_image'];
                if(!empty($fieldvalue)){
                    $value = $doc -> createTextNode($fieldvalue);
                    $child -> appendChild($value);
                }


                // text
                $occ3 = $doc -> createElement('text');  //创建元素
                $occ3 = $occ2 -> appendChild($occ3);  //加入元素

                // pic
                $child = $doc -> createElement('pic');
                $child = $occ3 -> appendChild($child);
                $fieldvalue =  $one['cover_image'];
                if(!empty($fieldvalue)){
                    $value = $doc -> createTextNode($fieldvalue);
                    $child -> appendChild($value);
                }
                // text_order
                $child = $doc -> createElement('text_order');
                $child = $occ3 -> appendChild($child);
                $fieldvalue = '1';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // 处理段落
                $content_arr = array_filter(explode('<p style="word-break:break-all;">', $one['details']));
                $sum_text = '0';
                $text_order = 1;
                foreach($content_arr as $num=>$p) {
                    // 处理段落
                    $content = strip_tags(trim($p));
                    if(empty($content)){
                        continue;
                    }
                    $text_order++;
                    $sum_text += mb_strlen($content);

                    // text
                    $occ3 = $doc -> createElement('text');  //创建元素
                    $occ3 = $occ2 -> appendChild($occ3);  //加入元素

                    // pic
                    $child = $doc -> createElement('content');
                    $child = $occ3 -> appendChild($child);
                    $fieldvalue = trim($content);
                    $value = $doc -> createTextNode($fieldvalue);
                    $child -> appendChild($value);

                    // text_order
                    $child = $doc -> createElement('text_order');
                    $child = $occ3 -> appendChild($child);
                    $fieldvalue = (string)$text_order;
                    $value = $doc -> createTextNode($fieldvalue);
                    $child -> appendChild($value);
                }
                // textlen
                $child = $doc -> createElement('textlen');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = (string)$sum_text;
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // type
                $child = $doc -> createElement('type');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = '普法知识';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // original
                $child = $doc -> createElement('original');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = '1';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // pdate   发布时间
                $child = $doc -> createElement('pdate');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = $one['created_at'];
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // browsed_time
                $child = $doc -> createElement('browsed_time');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = $one['visits'];
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // pcurl
                $child = $doc -> createElement('pcurl');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = "https://www.zaimingchaiqian.com/news/".$one['id']. '?utm_source=360_ask';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // wapurl
                $child = $doc -> createElement('wapurl');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = "https://www.zaimingchaiqian.com/news/".$one['id']. '?utm_source=360_ask';
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // author_name
                $child = $doc -> createElement('author_name');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = "北京在明律师事务所";
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // author_pic
                $child = $doc -> createElement('author_pic');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = "https://p0.ssl.img.360kuai.com/t01e53371f84f4176a3.jpg";
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // site
                $child = $doc -> createElement('site');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = "https://www.zaimingchaiqian.com";
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);

                // sitename
                $child = $doc -> createElement('sitename');  //创建元素
                $child = $occ2 -> appendChild($child);  //加入元素
                $fieldvalue = "北京在明律师事务所";
                $value = $doc -> createTextNode($fieldvalue);
                $child -> appendChild($value);
            }
        }
        $xml_string = $doc -> saveXML();

但是不能再网页上输出   上面的可以再网页上数去 能写入文件

        $results = (new Query())->from(News::tableName())
            ->where([
                'stage' => '发布',
                'category_id' => (new Query())->from(Category::tableName())
                    ->where(['title' => '精选问答'])
                    ->select('id'),
            ])
            ->andWhere(['between', 'created_at',  "$d1 00:00:00", "$d2 23:59:59"])
            ->select(['id', 'title', 'abstract', 'cover_image','details','visits','created_at'])
            ->orderBy('id DESC')
            ->all();

        $url_base = Url::base(true);

        $xmlStr = '<?xml version="1.0" encoding="utf-8"?><urlset content_method="full">';
        foreach($results as $k => &$one) {
            $xmlStr .= '<url>';
                $xmlStr .= '<loc><![CDATA[' .$url_base . '/news/' . $one['id'] . ']]></loc>';
                $xmlStr .= '<changefreq><![CDATA[always]]></changefreq>';
                $xmlStr .= '<priority><![CDATA[1.0]]></priority>';
                $xmlStr .= '<data>';
                    $xmlStr .= '<display>';
                        $xmlStr .= '<data_state><![CDATA[1]]></data_state>';
                        $xmlStr .= '<key><![CDATA['.$one['title'].']]></key>';
                        $xmlStr .= '<title><![CDATA['.$one['title'].']]></title>';
                        $xmlStr .= '<abstract><![CDATA['.$one['abstract'].']]></abstract>';
                        $xmlStr .= '<image><![CDATA['.$one['cover_image'].']]></image>';
                        $xmlStr .= '<text>';
                            $xmlStr .= '<pic><![CDATA['.$one['cover_image'].']]></pic>';
                            $xmlStr .= '<text_order><![CDATA[1]]></text_order>';
                        $xmlStr .= '</text>';
                        // 处理段落
                        $content_arr = array_filter(explode('<p style="word-break:break-all;">', $one['details']));
                        $sum_text = '0';
                        $text_order = 1;
                        foreach($content_arr as $num=>$p) {
                            // 处理段落
                            $content = trim(strip_tags(trim($p)));
                            if(empty($content)){
                                continue;
                            }
                            $text_order++;
                            $sum_text += mb_strlen($content);
                            // text
                            $xmlStr .= '<text>';
                                $xmlStr .= '<content><![CDATA['.$content.']]></content>';
                                $xmlStr .= '<text_order><![CDATA['.$text_order.']]></text_order>';
                            $xmlStr .= '</text>';
                        }
                        $xmlStr .= '<textlen><![CDATA['.(string)$sum_text.']]></textlen>';
                        $xmlStr .= '<type><![CDATA[普法知识]]></type>';
                        $xmlStr .= '<original><![CDATA[1]]></original>';
                        $xmlStr .= '<pdate><![CDATA['.$one['created_at'].']]></pdate>';
                        $xmlStr .= '<browsed_time><![CDATA['.$one['visits'].']]></browsed_time>';
                        $xmlStr .= '<pcurl><![CDATA[' .$url_base . '/news/' . $one['id'] . '?utm_source=360_ask]]></pcurl>';
                        $xmlStr .= '<wapurl><![CDATA[' .$url_base . '/news/' . $one['id'] . '?utm_source=360_ask]]></wapurl>';
                        $xmlStr .= '<author_name><![CDATA[在明律师事务所]]></author_name>';
                        $xmlStr .= '<author_pic><![CDATA[https://p0.ssl.img.360kuai.com/t01e53371f84f4176a3.jpg]]></author_pic>';
                        $xmlStr .= '<site><![CDATA[' .$url_base .']]></site>';
                        $xmlStr .= '<sitename><![CDATA[北京在明律师事务所]]></sitename>';
                    $xmlStr .= '</display>';
                $xmlStr .= '</data>';
            $xmlStr .= '</url>';
        }
        $xmlStr .= '</urlset>';
        echo $xmlStr;         //  最后用echo输出
        die;

xml本来就是知识盲区  所以这个东西做了好长时间最终查到了domdocument这个对象  这也算是一个突破口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值