Php Laravel - 如何在浏览器中显示xml文件

时间:2016-07-13 07:14:45

标签: php xml laravel

我在我的目录中生成了xml文件。我想用浏览器在浏览器中显示这个文件?

(我希望将其显示为站点地图)

这是我的代码:

   public function siteMap()
    {
        $test_array = array (
            'bla' => 'blub',
            'foo' => 'bar',
            'another_array' => array (
                'stack' => 'overflow',
            ),
        );

        $xml_template_info = new \SimpleXMLElement("<?xml version=\"1.0\"?><template></template>");

        $this->array_to_xml($test_array,$xml_template_info);
        $xml_template_info->asXML(dirname(__FILE__)."/sitemap.xml") ;
        header('Content-type: text/xml');
        dd(readfile(dirname(__FILE__)."/sitemap.xml"));
    }

    public function array_to_xml(array $arr, \SimpleXMLElement $xml)
    {
      foreach ($arr as $k => $v) {
          is_array($v)
              ? $this->array_to_xml($v, $xml->addChild($k))
              : $xml->addChild($k, $v);
      }
      return $xml;
   }

这是 sitemap.xml

<?xml version="1.0"?>
<template><bla>blub</bla><foo>bar</foo><another_array><stack>overflow</stack></another_array></template>

结果如下: enter image description here

我想在我的浏览器中显示此xml文件,是否有任何想法正确执行此操作?

已编辑:以下是标题的结果(&#39;内容类型:text / plain&#39;); enter image description here

它包含一些额外的报告。

10 个答案:

答案 0 :(得分:1)

尝试:

<?php

public function array_to_xml(array $data, \SimpleXMLElement $xml) {
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            if (is_numeric($key)) {
                $key = 'item' . $key; //dealing with <0/>..<n/> issues
            }
            $subnode = $xml->addChild($key);
            $this->array_to_xml($value, $subnode);
        } else {
            $xml->addChild("$key", htmlspecialchars("$value"));
        }
    }
}

public function siteMap()
    {
$data = array(
        'bla' => 'blub',
        'foo' => 'bar',
        'another_array' => array(
            'stack' => 'overflow',
        ),
    );

    $xml_template_info = new \SimpleXMLElement("<?xml version=\"1.0\"?><template></template>");
    $this->array_to_xml($data, $xml_template_info);
    $xml_template_info->asXML(dirname(__FILE__) . "/sitemap.xml");
    header('Content-type: text/xml');
    die(readfile(dirname(__FILE__) . "/sitemap.xml"));
//or return readfile(dirname(__FILE__) . "/sitemap.xml");
    }

答案 1 :(得分:1)

该错误告诉您输出的确切错误。关闭</template>标记后会有很多额外内容。没有任何东西会将它显示为XML,因为它不是有效的XML。有东西正在发送额外的数据!

也许在exit();电话后尝试readfile

答案 2 :(得分:0)

如果您只想在浏览器中以xml文件中的方式显示xml文件的内容,只需在基本地址后面的url中写入name_of_xml_file.xml

例如:

  

www.example.com/的 name_of_xml_file.xml

无论你把它放在哪里。

它应该在您的网站文件夹中,如果您想在某件事情发生时自动加载,只需使用一个功能重定向到该页面。

答案 3 :(得分:0)

在您的视图中创建sitemap.blade.php。
在sitemap.blade.php中插入内容xml。
创建一个名为sistemap的函数。

 public function sitemap(){

     return response()->view('sitemap')->header('Content-Type', 'text/xml');

 }


在您的路线中:

 Route::get('sitemap', function () {
     return view('sitemap');
 });

答案 4 :(得分:0)

我所做的是在Laravel的公共文件夹中添加xml文件。像sitemap.xml这样的东西。因此,您可以使用http://yourdomain.com/sitemap.xml轻松访问它。

答案 5 :(得分:0)

Laravel的dd函数输出一堆HTML,让您浏览调试输入。它用于调试,输出正常的内容到页面。你不应该这样使用它。

而不是

dd(readfile(dirname(__FILE__)."/sitemap.xml"));

return readfile(dirname(__FILE__)."/sitemap.xml");

答案 6 :(得分:0)

我创建了一个Laravel xml响应包:https://github.com/mtownsend5512/response-xml

安装它,就像这样简单:

$test_array = array (
        'bla' => 'blub',
        'foo' => 'bar',
        'another_array' => array (
            'stack' => 'overflow',
        ),
    );
return response()->xml($test_array, 200, [], 'template');

您会得到:

<?xml version="1.0"?>
<template>
    <bla>blub</bla>
    <foo>bar</foo>
    <another_array>
        <stack>overflow</stack>
    </another_array>
</template>

答案 7 :(得分:0)

假设xml的内容在$ xml变量中,则可以使用以下选项之一:

return response($xml, 200)->header('Content-Type', 'application/xml');

OR

return response($xml, 200, ['Content-Type' => 'application/xml']);

答案 8 :(得分:0)

改变你的路线:

allPSNR = zeros(1, numImages);
allSSIM = zeros(1, numImages);
for k = 1 : numImages
    baseFileName = theFiles(k).name;
    fullFileName = fullfile(theFiles(k).folder, baseFileName);

    baseFileName1 = theFiles1(k).name;
    fullFileName1 = fullfile(theFiles1(k).folder, baseFileName1);
    lab = imread(fullFileName);
    img = imread(fullFileName1);
    allPSNR(k) = psnr(img, lab);
    allSSIM(k) = ssim(img, lab);   
end    
meanPSNR = mean(allPSNR);
meanSSIM = mean(allSSIM);

答案 9 :(得分:0)

创建路线:

Route::get('sitemap.xml', 'SitemapController@index')->name('sitemapxml'); 

将此代码放入您的控制器中:

public function index() {
    $posts = Post::where('status', '=', 1)->get();
    return response()->view('sitemap_xml', ['posts' => $posts])->header('Content-Type', 'text/xml');
}

将此代码放入您的视图文件中:

<?= '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
        http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    @foreach ($posts as $post)
        <url>
            <loc>{{ url($post->url) }}</loc>
            <lastmod>{{ $post->updated_at->tz('UTC')->toAtomString() }}</lastmod>
            <changefreq>monthly</changefreq>
            <priority>0.7</priority>
        </url>
    @endforeach
</urlset>