【问题标题】:Display XML inside HTML在 HTML 中显示 XML
【发布时间】:2015-02-03 00:22:43
【问题描述】:

我正在尝试在 HTML 中显示原始 XML。如果没有 HTML 元素,则 XML 显示正常但是一旦我添加我的内容,就会出现此错误

error on line 37 at column 6: XML declaration allowed only at the start of the document

在做了一些研究之后,这个问题很常见,有空格,但我没有注意到。这是我有问题的源代码。

<?php require 'header.php'; ?>
<div class="sixteen columns">
<h3>XML</h3>
<?php 
header("Content-Type:text/xml");//Tell browser to expect xml
include("config/init.php");
$connection = mysqli_connect($hostname, $username, $password, $databaseName) or die("you did not connect");
$query = "SELECT * FROM art";
$result = mysqli_query($connection, $query) or die (mysqli_error($connection));
//Top of xml file
$_xml = '<?xml version="1.0" encoding="UTF-8"?>';
$_xml .="<art>"; 
while($row = mysqli_fetch_array($result)) { 
$_xml .="<art>"; 
$_xml .="<art_name>".$row['name']."</art_name>"; 
$_xml .="<art_category>".$row['category']."</art_category>"; 
$_xml .="<art_price>".$row['price']."</art_price>"; 
$_xml .="</art>"; 
} 
$_xml .="</art>"; 
//Parse and create an xml object using the string
$xmlobj=new SimpleXMLElement($_xml);
print $xmlobj->asXML();
$xmlobj->asXML('art.xml');
?>
</div>  
<?php require 'footer.php'; ?>

http://www.acalvert.x10host.com/xml.php如果你想查看页面源代码

【问题讨论】:

  • 您不能在 HTML 文档中更改内容类型。您是在尝试显示 XML 标记 还是尝试使用 XML 标记以便以某种方式呈现 XML 元素?究竟如何? XML 元素没有默认格式(CSS 意义上的内联元素除外)。
  • 试图显示 XML 标记,以便它显示在我的页面中。 IE 我可以查看页眉、页脚等

标签: php html xml


【解决方案1】:

如果要显示标记,请将所有 &amp;lt; 更改为 &amp;lt; 并将 &amp;gt; 更改为 &amp;gt;

在显示任何内容之前,将您的 XML 加载到字符串变量并使用它:

$before = array('<','>');
$after = array('&lt;','&gt;');
$xml = str_replace($before,$after,$xml);
echo $xml;

其次 - 在显示任何字符后,您无法调用 header() 函数。根本不要使用它。您希望在文档中使用默认的 text/html

【讨论】:

  • 我删除了标头函数,现在显示 XML。但是不是我喜欢的原始形式。虽然我不是专家并且仍在学习基础知识,但我并不完全理解您的答案。
  • &amp;lt; in code 在 html 页面中显示为 &amp;lt;。所以取而代之的是$xmlobj=new SimpleXMLElement($_xml); 和后面的调用粘贴我的代码,只需将我的$xml 更改为你的$_xml
  • 完全没有必要替换“>”字符。一般情况下,如果出现“&”字符,必要的。
【解决方案2】:
  1. 您可以使用 simplexml 类来创建 XML 节点。
  2. 如果您想要原始 XML,则不能使用 &lt;div class="sixteen columns"&gt;&lt;h3&gt;XML&lt;/h3&gt;&lt;/div&gt;。您必须决定是否需要 XML 或 HTML 输出。

以下是使用 SimpleXMLElement 创建和打印 XML 输出的方法:

How to write CDATA using SimpleXmlElement?

你的情况是:

<?php
class SimpleXMLExtended extends SimpleXMLElement {
    public function addCData($cdata_text) {
        $node = dom_import_simplexml($this);
        $no   = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($cdata_text));
    }
}


$docXML = new SimpleXMLExtended("<art/>");

while($row = mysqli_fetch_array($result)) { 
  $nodeXML0 = $docXML->addChild("art");
  $nodeXML01 = $nodeXML0->addChild("art_name");
  $nodeXML01->addCData($row['name']);
  $nodeXML02 = $nodeXML0->addChild("art_category");
  $nodeXML02->addCData($row['category']);
  $nodeXML03 = $nodeXML0->addChild("art_price");
  $nodeXML03->addCData($row['price']);

}
Header('Content-type: text/xml');
echo $docXML->asXML();
?>

【讨论】:

  • 那么为什么这个答案还是被降级了?对此解决方案有何反对意见?
【解决方案3】:

当您想将 XML 标记显示为文本(正如您在评论中阐明的那样)而不是解释为标记时,您只需像在 HTML 文档中将 HTML 标记显示为文本一样执行相同的操作。这意味着

  • 将任何出现的“&lt;
  • 将任何出现的“&”转义为&amp;amp;

例如,而不是

$_xml = '<?xml version="1.0" encoding="UTF-8"?>';

$_xml = '&amp;?xml version="1.0" encoding="UTF-8"?>';

另外,你需要删除这些行

header("Content-Type:text/xml");//Tell browser to expect xml

因为您已经在生成响应正文并且无法注入任何 HTTP 标头。

有一种方法可以告诉浏览器标记按原样显示而不是解释:将其包装在标签&lt;xmp&gt;&lt;/xmp&gt; 之间。 xmp 元素从一开始就存在于 HTML 实现中,但很长一段时间以来它都被声明为弃用/过时。它仍然有效,并且还会导致保留有关换行符和空格的源格式。

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 2012-04-10
    • 2013-01-02
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多