在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字符?
∈不是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解析输入之前,可能需要将输入转换为其他编码。
- 读取文件内容文本
- 转换为不同的编码
- 解析用SimpleXML和做任何你想做
- 如果需要的话,将输出转换为原始编码
为此,函数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 - 工程
不,这不是问题,因为MathML在其他地方的Safari 5.1.4中工作。 – 2012-03-17 19:06:07
我恭敬地不同意。如果你在不同的浏览器中打开你的脚本,你会看到每个脚本以不同的方式呈现脚本的输出。 – 2012-03-17 19:08:07
是的我知道,它在每个浏览器中都会有所不同,但在Safari 5.1.4(和Firefox)中加载XML文件时,如预期的那样显示MathML(不含Â)。所以这不是问题 – 2012-03-17 19:11:44
∈不是可以在ISO 8859-1中表示的字符,请将您的XML更改为使用UTF-8编码。您还需要告诉PHP它的输出是UTF-8。 – salathe 2012-03-17 18:28:41
,但如果我只是在浏览器中查看xml文件本身,那么它的表现也很好,而且正如我上面所说的,只有在挖掘结构后才会出现。 – 2012-03-17 18:29:58
然后PHP已经输出为UTF-8,你仍然需要在XML中改变'encoding =“...”''。 – salathe 2012-03-17 18:32:09