XML 解析错误:文档元素之后的垃圾
问题描述:
我不断收到 xml 解析错误,我认为这与空格和注释有关,但由于我对 php、mysql 和 xml 有点陌生,因此我不能 100% 确定以下代码是否正确.
i keep getting a xml parse error, and i think its gotta do with spaces and comments, but since i'm kinda new to php, mysql and xml i'm not 100% sure if the following code is correct.
我收到错误:
XML-parsefout: troep na documentelement
Locatie: xml.php
Regelnummer 10, kolom 1:<project id="90">
^
翻译:
XML-parseerror: junk after document element
Location: xml.php
Regelnummer 10, kolom 1:<project id="90">
^
代码:
<?php
$sql = "SELECT * FROM projecten ORDER BY id";
$res = mysql_query($sql);
$version = '1.0';
$encoding = 'UTF-8';
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument();
$xml->setIndent(true);
//WHILE LOOP OM ALLE GEGEVENS UIT DE QUERY TE HALEN
while ($row = mysql_fetch_assoc($res)) {
//START PROJECT
$xml->startElement('project');
$xml->writeAttribute('id', $row['id']);
//ID
$xml->startElement("id");
$xml->writeRaw($row['id']);
$xml->endElement();
//PROJECTNAAM
$xml->startElement("projectnaam");
$xml->writeRaw($row['projectnaam']);
$xml->endElement();
//PROJECTSTATUS
$xml->startElement("status");
$xml->writeRaw($row['status']);
$xml->endElement();
//KLANTNAAM
$xml->startElement("klantnaam");
$xml->writeRaw($row['klantnaam']);
$xml->endElement();
//STARTDATUM
$xml->startElement("startdatum");
$xml->writeRaw($row['startdatum']);
$xml->endElement();
//EINDDATUM
$xml->startElement("eindddatum");
$xml->writeRaw($row['einddatum']);
$xml->endElement();
//EINDE PROJECT
$xml->endElement();
}
//EINDE DOCUMENT
$xml->endDocument();
header('Content-type: text/xml');
$xml->flush();
?>
这是浏览器生成的:
<parsererror>
XML-parsefout: troep na documentelement Locatie: xml.php Regelnummer 10, kolom 1:
<sourcetext><project id="90"> ^</sourcetext>
</parsererror>
答
/**
* Rewrite MySQL to MySQLi
* http://php.net/manual/en/migration55.deprecated.php
**/
$sql = "SELECT * FROM projecten ORDER BY id";
$res = mysqli_query($sql);
/**
* Adjusted startDoc to include
* Encoding and set Indent to tab
* instead of spacing.
**/
$xml = new XMLWriter();
$xml->openURI("php://output");
$Xml->setIndentString ( "	" );
$Xml->startDocument( '1.0', 'UTF-8', 'no' );
$xml->setIndent(true);
/**
* Re-usable function to
* write a Start/End Element
* to XMLWriter.
*
* Uses CDdata for longer text strings
**/
function addNode( $xml, $NodeName, $Value ) {
$xml->startElement( $NodeName );
$xml->writeCData( $Value );
$xml->endElement();
}
/**
* Start a Root Element
**/
$xml->startElement('projects');
/**
* LoopThrough each Database row.
**/
while ($row = mysqli_fetch_assoc($res)) {
//START PROJECT
$xml->startElement('project');
$xml->writeAttribute('id', $row['id']);
addNode( $xml, "Id", $row["id"] );
addNode( $xml, "projectnaam", $row['projectnaam'] );
addNode( $xml, "status", $row['status'] );
addNode( $xml, "klantnaam", $row['klantnaam'] );
addNode( $xml, "startdatum", $row['startdatum'] );
addNode( $xml, "eindddatum", $row['eindddatum'] );
//End 'Project'.
$xml->endElement();
}
//End Root Element.
$xml->endElement();
//EINDE DOCUMENT
$xml->endDocument();
header('Content-type: text/xml');
$xml->flush();
- 改为MySQL到MySQLi!重要的是现在就开始改变吧!=)
- 使用函数!你写
$xml->startElement
&$xml->endElement
重复,将其放入addNode()
方法中. - 添加了一个Root"节点来附加每个数据库行.
- 使用
CData
(<![CDATA[包含在 CData 标签中的文本]]>
),这将有助于安全地转义任何困难的可能字符 - Changed to MySQL to MySQLi! It's important to start changing now while you can! =)
- Use Functions! You write
$xml->startElement
&$xml->endElement
repeatedly, placed it into anaddNode()
method. - Added a 'Root' node to append each database row too.
- Use
CData
(<![CDATA[text for inclusion within CData tags]]>
), it'll help to safetly escape any difficult possible characters