使用PHP5在解析的XML输出中缺少字符

时间:2009-09-16 11:40:15

标签: php xml simplexml

我正在尝试解析以下XML文件:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE content PUBLIC "-//BLACKWELL PUBLISHING GROUP//DTD 4.0//EN" "http://www.blackwellpublishing.com/xml/dtds/4-0/bpg4-0.dtd">
<content dtdver="4.0" docfmt="xml">
....
<forenames>NIELS B&Oslash;IE</forenames><x> </x>

起初它不会加载,但现在我有代码,至少似乎使用DTD来找出像&Oslash;(Ø)这样的实体,但下一个问题是它没有显示输出中的字符。

这是我的解析代码:

$options = LIBXML_DTDLOAD | LIBXML_NOENT | LIBXML_DTDVALID | LIBXML_NOCDATA;
$doc = simplexml_load_string ( $xml,null,$options );
echo $doc->document->header->namegroup->name->forenames."\n";

这是输出:

NIELS BIE

我也尝试使用DOM XML解析,然后输出是NIELS B IE(所以有空格..)

任何想法?

4 个答案:

答案 0 :(得分:2)

您在XML文件中使用的DTD不包含Oslash实体。因此,XML解析器根本不知道如何处理Ø并且随之产生混乱和/或欢闹。

将HTML的命名实体(其中Oslash是其中的一部分)的概念与XML的命名实体(apos,lt,gt,quot,amp)的概念分开是很重要的。基本上,如果它不是HTML,则没有Oslash(至少在一般情况下,某些DTD可能有它,但它可能不是你想要的角色。

换句话说;总是使用UTF-8。总是

编辑:Ø也是latin-1。

答案 1 :(得分:2)

看看DTD,它说(但没有换行符):

<!ENTITY Oslash 
    "<symbol name='Oslash' unicode='00D8'
     type='html' glyph='@Oslash;' description='capital O, slash' 
     ascii='O' > </symbol>"
>

对于使用此DTD的任何XML阅读器,这意味着“只要您在源代码中看到这些字母的确切组合:&Oslash;,请将其替换为此文字:<symbol name='Oslash' unicode... > </symbol>

这意味着XML数据实际上是这样读的:

<forenames>NIELS B<symbol name='Oslash' unicode='00D8'
     type='html' glyph='@Oslash;' description='capital O, slash' 
     ascii='O' > </symbol>IE</forenames>

...这解释了为什么它没有出现在您的浏览器中。解决这个问题的方法是在XML文档中搜索所有<symbol>元素,阅读unicode参数并用它替换它们。


进一步观察,DTD顶部的评论显示他们已经考虑过你的情况! glyph标记上的<symbol>属性是用于该符号的标准HTML实体,但将&符号替换为@。

10 read xml document
20 search for any <symbol> element
30 read the "glyph" attribute
40 remove the <symbol> element
50 replace the @ with an & in glyph
60 write that in the place of <symbol>
70 goto 20

答案 2 :(得分:1)

如果编码正确,则无需转义&Oslash;(Ø)。尝试使用unicode来确定。

如果无法改变行为,请尝试取消HTML实体,请查看PHP手册。

答案 3 :(得分:0)

好的,进一步说,如果我用var_dump而不是echo我得到这个:

object(SimpleXMLElement)[22]
  public 'symbol' => 
  object(SimpleXMLElement)[21]
  public '@attributes' => 
    array
      'name' => string 'Oslash' (length=6)
      'unicode' => string '00D8' (length=4)
      'type' => string 'html' (length=4)
      'glyph' => string '@Oslash;' (length=8)
      'description' => string 'capital O, slash' (length=16)
      'ascii' => string 'O' (length=1)
  string ' ' (length=1)

我想知道如何使用它来创建一个完整的字符串和forenames的内容