用PHP解析XML文档

时间:2012-03-17 18:19:55

标签: php xml parsing encoding simplexml

我有一个XML文件,我在php中使用SimpleXML进行解析。第一行是

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

如果我这样做,则解析的结果存储在$xml中:

echo $xml->asXML();

然后整个文件显示完美。

但是如果我无论如何都要深入研究这个结构,我就会无处可去,例如:

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

在一些XML元素中有MathML(<math>),这就是Â发生的地方。 例如,字符被替换为。

如何解析XML文件但不丢失MathML字符?

3 个答案:

答案 0 :(得分:2)

∈不是可以在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表示)以下内容。

â
∈

encoding设置为不同时,SimpleXML将尝试转换为UTF-8。当输入已经是UTF-8编码并且encoding声明不正确时,最好不要让它工作。


还要确保PHP本身输出UTF-8,并告诉浏览器这是这种情况!

您可以通过设置default_charset INI选项(在php.ini中或使用ini_set())或发送正确的Content-Type标题(header('Content-Type: text/html; charset=utf-8'))来执行此操作。

答案 1 :(得分:0)

问题不在于您的编码,问题是并非所有浏览器都支持MathML您的script回显到浏览器。

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

在以下浏览器中对此进行了测试:

  • Safari 5.1.2 - 失败
  • Chrome 17.0.9x - 部分
  • Firefox 3.6.28 - 正常工作

答案 2 :(得分:-1)

在使用SimpleXML解析输入之前,您可能需要将输入转换为其他编码。

  1. 以文字形式阅读文件内容
  2. 转换为不同的编码
  3. 使用SimpleXML解析并执行任何您想要的操作
  4. 如果需要,将输出转换为原始编码
  5. 为此,函数iconv()非常有用: http://php.net/manual/en/function.iconv.php