Разбор XML-документа в PHP - PullRequest
2 голосов
/ 17 марта 2012

У меня есть файл XML, который я анализирую с помощью SimpleXML в php. Первая строка -

<?xml version="1.0" encoding="iso-8859-1"?>

Результат анализа сохраняется в $xml, если я это сделаю:

echo $xml->asXML();

тогда весь файл отображается идеально.

Но если я в любом случае копаюсь в структуре, я всегда и везде получаю, например:

echo $xml->Chapter->asXML();

Внутри некоторых элементов XML есть MathML (<math>), именно здесь и происходит. Например, символ заменяется на.

Как я могу разобрать файл XML, но не потерять символы MathML?

Ответы [ 3 ]

2 голосов
/ 17 марта 2012

∈ не является символом, который может быть представлен в ISO 8859-1, измените ваш XML, чтобы сказать, что он закодирован с помощью UTF-8.

Чтобы привести пример, демонстрирующий проблему.

$x = simplexml_load_string('<?xml version="1.0" encoding="iso-8859-1"?>
<example><math>∈</math></example>');
echo $x->math, PHP_EOL;

$x = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?>
<example><math>∈</math></example>');
echo $x->math, PHP_EOL;

Выводы (как UTF-8) следующие.

â
∈

SimpleXML попытается преобразоватьв UTF-8, когда encoding установлен на что-то другое.Это всегда хорошая идея - не выполнять эту работу, когда вход уже закодирован в формате UTF-8, а объявление encoding неверно.


Также убедитесь, что сам PHP выводит UTF-8, и сказать браузеру, что это так!

Вы можете сделать это, установив опцию default_charset INI (в вашем php.ini или с помощью ini_set()), или отправив правильный Content-Type заголовок (header('Content-Type: text/html; charset=utf-8')).

0 голосов
/ 17 марта 2012

Проблема не в вашей кодировке, а в том, что не все браузеры поддерживают MathML , что ваш скрипт эхом отображает в браузере.

http://en.wikipedia.org/wiki/MathML#Web_browsers

Протестировано в следующем браузере:

  • Safari 5.1.2 - не удалось
  • Chrome 17.0.9x - частично
  • Firefox 3.6.28 -работы
0 голосов
/ 17 марта 2012

Вам может потребоваться преобразовать входные данные в другую кодировку перед синтаксическим анализом с помощью SimpleXML.

  1. Считать содержимое файла как текст
  2. Конвертировать в другую кодировку
  3. Разбор с SimpleXML и делай что хочешь
  4. При необходимости преобразовать вывод в исходную кодировку

Для этого функция iconv () очень полезна: http://php.net/manual/en/function.iconv.php

...