我正在尝试使用PHP创建一个Web服务,以便与应用程序进行通信,从数据库获取数据并将其转换为应用程序的XML格式.但是,其中一列包含HTML,需要输出(我认为)作为CDATA.虽然我很难完成这个.请指教
<?PHP
MysqL_connect(DB_HOST, DB_USER, DB_PASSWORD);
MysqL_select_db(DB_NAME);
$sql = "SELECT post_date_gmt, post_content, post_title FROM [schema].wp_posts WHERE post_status = \"publish\" && post_type = \"post\" ORDER BY post_date_gmt DESC;";
$res = MysqL_query($sql);
$xml = new XMLWriter();
$xml->openURI("PHP://output");
$xml->startDocument();
$xml->setIndent(true);
$xml->startElement('BlogPosts');
while ($row = MysqL_fetch_assoc($res)) {
$xml->startElement("Post");
$xml->startElement("PostDate");
$xml->writeraw($row['post_date_gmt']);
$xml->endElement();
$xml->startElement("PostTitle");
$xml->$writeraw($row['post_title']);
$xml->endElement();
$xml->startCData("PostContent");
$xml->writeCData($row['post_content']);
$xml->endCData();
$xml->endElement();
}
$xml->endElement();
header('Content-type: text/xml');
$xml->flush();
?>
非常感谢您提供的任何帮助!
解决方法:
不要使用XMLWriter :: writeraw(),除非您真的想直接编写XML片段. “原始”意味着这里不会逃离图书馆.
将文本写入XML文档的正确方法是XMLWriter :: text().
$xml->startElement('PostTitle');
$xml->text('foo & bar');
$xml->endElement();
输出:
<?xml version="1.0"?>
<PostTitle>foo & bar</PostTitle>
如果在此示例中使用XMLWriter :: writeraw(),则结果将包含未转义的&并且是无效的XML.
CDATA部分是与文本节点不同的字符节点,但允许特殊字符而不转义并保留空格.您始终必须单独创建元素节点.元素节点可以包含多个其他节点,甚至包含多个CDATA节.
XmlReader有两种创建CDATA部分的方法:
一种方法:
$xml->startElement("PostContent");
$xml->writeCData('<b>post</b> content');
$xml->endElement();
输出:
<?xml version="1.0"?>
<PostContent><![CDATA[<b>post</b> content]]></PostContent>
或者开始/结束方法:
$xml->startElement("PostContent");
$xml->startCData();
$xml->text('<b>post</b> content');
$xml->text(' more content');
$xml->endCData();
$xml->endElement();
输出:
<?xml version="1.0"?>
<PostContent><![CDATA[<b>post</b> content more content]]></PostContent>