php – 使用XMLWriter将变量数据输出为CDATA XML

我正在尝试使用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 &amp; 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>

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...