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

Kir*_*and 3 php xml sql cdata

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

?>
Run Code Online (Sandbox Code Playgroud)

非常感谢您提供的任何帮助!

ThW*_*ThW 5

不要使用XMLWriter::writeRaw(),除非您真的想直接编写XML片段."原始"意味着这里不会逃离图书馆.

将文本写入XML文档的正确方法是XMLWriter::text().

$xml->startElement('PostTitle');
$xml->text('foo & bar');
$xml->endElement();
Run Code Online (Sandbox Code Playgroud)

输出:

<?xml version="1.0"?>
<PostTitle>foo &amp; bar</PostTitle>
Run Code Online (Sandbox Code Playgroud)

如果您XMLWriter::writeRaw()在此示例中使用,则结果将包含未转义&且无效的XML.

CDATA部分是与文本节点不同的字符节点,但允许特殊字符而不转义并保留空格.您始终必须单独创建元素节点.元素节点可以包含多个其他节点,甚至包含多个CDATA节.

XmlReader有两种创建CDATA部分的方法:

一种方法:

$xml->startElement("PostContent");
$xml->writeCData('<b>post</b> content');
$xml->endElement();
Run Code Online (Sandbox Code Playgroud)

输出:

<?xml version="1.0"?>
<PostContent><![CDATA[<b>post</b> content]]></PostContent>
Run Code Online (Sandbox Code Playgroud)

或者开始/结束方法:

$xml->startElement("PostContent");
$xml->startCData();
$xml->text('<b>post</b> content');
$xml->text(' more content');
$xml->endCData();
$xml->endElement();
Run Code Online (Sandbox Code Playgroud)

输出:

<?xml version="1.0"?>
<PostContent><![CDATA[<b>post</b> content more content]]></PostContent>
Run Code Online (Sandbox Code Playgroud)