框架里如何输出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这个对象 这也算是一个突破口