2014-12-04 67 views
1

我试图在HTML中显示原始XML。如果没有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如果你想查看页面源

+0

您不能在HTML文档中更改内容类型。您是否尝试显示* XML标记*或尝试使用XML标记,以便以某种方式呈现XML元素?究竟如何? XML元素没有默认的格式(除了CSS意义上的内联元素)。 – 2014-12-04 23:25:15

+0

试图显示XML标记,以便它显示在我的页面中。 I.E我可以查看页眉,页脚等 – Calv 2014-12-04 23:37:15

回答

1

如果你想标记来显示,然后更改所有<&lt;>&gt;

任何显示加载XML字符串变量,并使用此之前:

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

其次 - 显示任何字符后,你不能叫header()功能。根本不要使用它。您需要在文档中使用默认text/html

+0

我已经删除了标题功能,现在显示XML。然而不是以原始形式,这是Id喜欢的。我不完全理解你的答案,因为我不是专家,仍然在学习基础知识。代码中的 – Calv 2014-12-04 23:54:28

+0

'<'在HTML页面中显示为'<'。因此,改为'$ xmlobj = new SimpleXMLElement($ _ xml);'和后者调用粘贴我的代码,只需将'$ xml'改为我的$ _xml' – Forien 2014-12-04 23:59:56

+0

现在可以工作,谢谢 – Calv 2014-12-05 00:06:37

-1
  1. 您可以使用simplexml类来创建XML节点。
  2. 如果你想要一个原始的XML,你不能使用<div class="sixteen columns"><h3>XML</h3></div>。您必须决定是否需要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(); 
?> 
+0

那么为什么这个答案降级呢?任何反对这个解决方案的论点 – 2014-12-05 15:08:21

-1

当你想显示XML标记作为文本(正如你在评论中所阐明的那样),而不是解释为标签,你只需要像在HTML文档中将HTML标记显示为文本一样。这意味着

  • 逸出的“<”任何发生如&lt;
  • 逸出的“&”任何发生如&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标头。

的方式告诉标记被原样显示,而不是解释的浏览器:标签<xmp></xmp>之间的包裹。xmp元素从一开始就一直在HTML实现中,但很久以来它已被宣布为废弃/废弃。它仍然有效,并且还会导致关于换行符和空格的源格式保留。