在PHP中解析XML文档

问题描述:

我有一个XML文件,我正在用SimpleXML在php中解析。第一行是在PHP中解析XML文档

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

解析的结果被存储在$xml,如果我做的:

echo $xml->asXML(); 

然后将整个文件显示完美。

但如果我深入到结构,无论如何,我得到的everwhere,如:

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

里面的一些XML元素的存在MATHML(<math>),这是A的发生在哪里。 例如字符被替换为。

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

+1

∈不是可以在ISO 8859-1中表示的字符,请将您的XML更改为使用UTF-8编码。您还需要告诉PHP它的输出是UTF-8。 – salathe 2012-03-17 18:28:41

+0

,但如果我只是在浏览器中查看xml文件本身,那么它的表现也很好,而且正如我上面所说的,只有在挖掘结构后才会出现。 – 2012-03-17 18:29:58

+0

然后PHP已经输出为UTF-8,你仍然需要在XML中改变'encoding =“...”''。 – salathe 2012-03-17 18:32:09

∈不是char可以在ISO 8859-1中表示的acter,将你的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将尝试当encoding设置为不同的东西转换为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'))做到这一点。

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

  1. 读取文件内容文本
  2. 转换为不同的编码
  3. 解析用SimpleXML和做任何你想做
  4. 如果需要的话,将输出转换为原始编码

为此,函数iconv()非常有用: http://php.net/manual/en/function.iconv.php

问题不是你的编码,问题是并非所有的浏览器都支持MathML,你的script回显给浏览器。

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

在以下浏览器测试了这个:

  • Safari浏览器5.1.2 - 失败
  • 铬17.0.9x - 部分
  • 火狐3.6.28 - 工程
+0

不,这不是问题,因为MathML在其他地方的Safari 5.1.4中工作。 – 2012-03-17 19:06:07

+0

我恭敬地不同意。如果你在不同的浏览器中打开你的脚本,你会看到每个脚本以不同的方式呈现脚本的输出。 – 2012-03-17 19:08:07

+0

是的我知道,它在每个浏览器中都会有所不同,但在Safari 5.1.4(和Firefox)中加载XML文件时,如预期的那样显示MathML(不含Â)。所以这不是问题 – 2012-03-17 19:11:44