Ваш вопрос действительно широк, лучший ответ, который я могу дать, что вы должны использовать некоторые существующие библиотеки для кодирования XML вместо написания (поскольку вы, очевидно, не выполняете работу, следовательно, ошибка XML-кодирования, о которой сообщает XML-консумент).
Использование существующей библиотеки также позволит вам указывать проблемы ранее. Например. для следующего кода убедитесь, что все, что вы вернетесь из своей базы данных, - это кодированные строки UTF-8.
Также, используя более современный клиентский класс базы данных, вы также сможете значительно списать код. Вот пример с PDO
и DOMDocument
:
### configuration values
$config = array(
'Database' => array(
'dsn' => 'mysql:dbname=test;host=localhost;charset=utf8',
'user' => 'testuser',
'pass' => 'test',
),
'table_name' => 'config',
'table_fields' => '*',
);
### implement database access
class Database extends PDO
{
public function __construct(array $config = null)
{
$config = $config ? : $GLOBALS['config'][__CLASS__];
parent::__construct($config['dsn'], $config['user'], $config['pass']);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
}
### setup the datasource ($rows)
$db = new Database();
$rows = $db->query("SELECT $config[table_fields] FROM $config[table_name]");
### setup the XML encoder ($doc)
$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadXML("<$config[table_name]s/>");
$doc->encoding = 'utf-8';
### fetch data from the datasource and encode the XML
foreach ($rows as $row) {
$child = $doc->createElement($config['table_name']);
$child = $doc->documentElement->appendChild($child);
foreach ($row as $key => $value) {
$child->appendChild($doc->createElement($key, $value));
}
}
### output XML
header("Content-Type:text/xml");
echo $doc->saveXML();
Смотрите, что DomDocument
ухаживают здесь правильное кодирование строк UTF-8, которые возвращаются из базы данных. Существует (обычно) нет необходимости в <![CDATA[...]]>
здесь. Как вы можете себе представить, вы, вероятно, положили что-то там, что сломало вашу XML-кодировку.
Также для взаимодействия с базой данных большая часть вашего кода также не нужна, вы можете просто перебирать строки, если строк нет, не было бы итерации. Обычно это лучше всего выражается с помощью Iterator
, который может работать на языке, который может работать на основе современных интерфейсов баз данных. Технически вы можете заменить $rows
здесь многими другими вещами, такими как итератор, который перебирает несколько таблиц один за другим.
Кроме того, использование режима ошибок исключает возможность размещения чеков и die
по всей вашей кодовой базе.
Примерный выход:
<?xml version="1.0" encoding="utf-8"?>
<configs>
<config>
<id>1</id>
<option>value for option with ID1</option>
</config>
<config>
<id>2</id>
<option>value for option with ID2</option>
</config>
...
</configs>
Если вы после этого нужно создать CDATA элементов, она работает так же (я показываю только часть сценария здесь, который содержит только небольшую модификацию добавление секций CDATA вместо о стоимости ребенка):
### fetch data from the datasource and encode the XML
foreach ($rows as $row) {
$child = $doc->createElement($config['table_name']);
$child = $doc->documentElement->appendChild($child);
foreach ($row as $key => $value) {
$child->appendChild($doc->createElement($key))
->appendChild($doc->createCDATASection($value))
;
}
}
Здесь так же, DOMDocument
заботится о правильном кодировании раздел CDATA. Что-то, вероятно, вы этого не сделали.
Возможные проблемы, с которыми вы все еще можете столкнуться, - это имена таблиц или строк, которые являются invalid XML names. Но тогда DOMDocument
на самом деле скажет вам, что вы знаете, генерируя XML, а не только после этого с ошибкой кодирования.
Если вам нужна помощь, вам нужно задать конкретный вопрос. Это начинается с выяснения того, что именно вызывает ошибку кодирования. Если вы не в состоянии, мы не можем вам помочь. (вы видите, что с различными ответами, которые, скорее всего, будут догадками, которые, как вы можете себе представить, вам не помогут). – hakre