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