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

标签 php sql xml 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();

?>

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

最佳答案

不要使用 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>

关于php - 使用 XMLWriter 将变量数据输出为 CDATA XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26276064/

相关文章:

php - php shell_exec 权限问题

sql - select and join 错误必须出现在 GROUP BY 子句中或在聚合函数中使用

android - 更改默认抽屉导航的图标大小

php - 来自 mysql/JSON 的 twitter bootstrap typeahead 源代码

php - Laravel POST 输入有限制吗?

mysql - 表不工作 : 1215. 无法添加外键约束

MySQL 使用 IF 语句

java - 为什么 sax 解析比 dom 解析快? stax 是如何运作的?

php - 在多个托管 XML 文件中搜索字符串

php - 如何知道客户端启用了javascript?