【问题标题】:change mime type of output in php在 php 中更改输出的 mime 类型
【发布时间】:2010-09-14 04:47:18
【问题描述】:

我有一个 php 脚本。大多数情况下,脚本返回 html,这工作正常,但有时(参数 ?Format=XML)脚本返回 XML 而不是 HTML。

有什么方法可以将返回的 php 输出的 mime 类型从 text/html 更改为 text/xml 或 application/xml?

【问题讨论】:

  • 你能提供更多关于你想要做什么的信息吗?即RSS,xhtml等?我还发现了这个错误:support.microsoft.com/kb/264868
  • 确保在输出任何文本之前使用标题调用
  • 哇,我的错误,它在 IE 中工作 - 我的 XML 生成代码有一个很大的错误(我从一些教程中复制了它,并没有真正阅读输出行,它将 XML 转换为HTML 使用 htmlentities。对不起!!!
  • PS.:既然您想知道,似乎在 SO 上,用法是选择第一个正确答案... :-) 这是合乎逻辑的。
  • 是的,似乎是最好的方法 - 即使其他答案包含有效点,第一个答案也丢失了(在任何其他输出之前发送,使用 application/xml 而不是 text/xml)。谢谢!

标签: php xml mime-types


【解决方案1】:
header('Content-Type: application/xml; charset=utf-8');

您也可以在同一行中添加编码。我加了utf-8,这个是最常见的。

【讨论】:

    【解决方案2】:

    我刚刚使用了以下内容:
    注意:我将“i”用于 sql 改进扩展。

    Start XML file, echo parent node
    header("Content-type: text/xml");
    echo "<?xml version='1.0' encoding='UTF-8'?>";
    echo "<marker>";
    

    遍历行,为每个行打印 XML 节点

    while ($row = @mysqli_fetch_assoc($results)){
      // Add to XML document node
      echo '<marker ';
      echo 'id="' . $ind . '" ';
      echo 'name="' . parseToXML($row['name']) . '" ';
      echo 'address="' . parseToXML($row['address']) . '" ';
      echo 'lat="' . $row['lat'] . '" ';
      echo 'lng="' . $row['lng'] . '" ';
      echo 'type="' . $row['type'] . '" ';
      echo '/>';
    }
    
    // End XML file
    echo "</marker>";
    

    【讨论】:

      【解决方案3】:

      您应该在发送任何输出之前发送Content-Type 标头

      header('Content-Type: text/xml');
      

      【讨论】:

        【解决方案4】:
        header('Content-type: application/xml');
        

        更多信息请参见header() 的 PHP 文档

        【讨论】:

        • 发生在我身上的是,Microsoft Visual Studio API 生成 Web 服务客户端不喜欢“application/xml”,而是需要“text/xml”。
        【解决方案5】:

        我会回答更新,因为以前的答案很好。
        我读过 Internet Explorer 以忽略 Mime 类型标头(大部分时间?)以依赖文件内容(在某些情况下可能导致问题)而闻名。

        嗯,我做了一个简单的测试:

        <?php
        header('Content-Type: text/xml');
        echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <root><foo a="b">Tada</foo></root>';
        ?>
        

        Internet Explorer 6 将其正确显示为 XML。即使我删除了 xml 声明。
        您应该指出哪个版本有问题。

        实际上,正如我在上面所写的,对于 IE(至少 6 个),您甚至不需要内容类型,它可以识别 XML 数据并将其显示为树。你的 XML 正确吗?

        [更新] IE7 也试过了,也添加了 ?format=xml,仍然正确显示 XML。如果我发送格式错误的 XML,IE 会显示错误。在 WinXP Pro SP2+ 上测试

        【讨论】:

        • 对不起,我的错误,我复制的示例代码确实通过htmlentities发送了XML进行输出,直到现在我才注意到!
        • 啊!好的。 :-) 我们都从错误中学习(甚至是其他人的错误!)。
        • 我认为 IE 6 有问题的是 text/xhtml;我从来没有玩过它,但我听到了很多关于它的抱怨。我相信如果您发送 text/xhtml,IE 6 将无法正常工作,但我不确定。
        • 一种 IE 存在问题的类型是 XHTML,即 application/xhtml+xml 或 application/xml -- IE 不会呈现使用这些正确内容类型中的任何一种发送的 XHTML(您可以错误地发送为text/html 强制 IE 使用其 HTML 模式,但这是错误的,可能会导致其他副作用)。
        【解决方案6】:

        设置Content-Type 标头:

        header('Content-Type: text/xml');
        

        虽然您可能应该改用“application/xml”。

        【讨论】:

        • 你明白了 - text/xml 和 application/xml 之间有什么区别?
        • text/*内容类型HTTP关于编码的交互,主要见annevankesteren.nl/2005/03/text-xml
        • 缓存代理可以编辑text/*来改变字符编码。由于 XML 还在文档本身中声明了其字符编码,因此您真的不希望发生这种情况,因为您可能会遇到不匹配的情况。所以请改用application/xml,缓存代理会将内容视为二进制数据并使其不受干扰。
        猜你喜欢
        • 2021-10-03
        • 2010-11-30
        • 1970-01-01
        • 2012-04-27
        • 2014-10-21
        • 2011-03-14
        • 2015-03-10
        • 1970-01-01
        • 2012-08-22
        相关资源
        最近更新 更多