我正在尝试解析以下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ØIE</forenames><x> </x>起初它不会加载,但现在我的代码至少看起来像是使用DTD来找出像Ø (?)这样的实体,但是下一个问题是它不能在输出中显示字符。
这是我的解析代码:
$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 (所以用一个空格..)
有什么想法吗?
发布于 2009-09-16 13:25:33
看一下DTD,它是这样说的(但没有换行):
<!ENTITY Oslash
"<symbol name='Oslash' unicode='00D8'
type='html' glyph='@Oslash;' description='capital O, slash'
ascii='O' > </symbol>"
>对于任何使用这个DTD的XML阅读器来说,这意味着“只要您在Ø源文件中看到这个确切的字母组合,就用下面的文本替换它:<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>...which解释了为什么它没有显示在你的浏览器中。解决方法是在XML文档中搜索所有<symbol>元素,读取unicode参数并将其替换为该参数。
再看一看,DTD顶部的评论表明他们已经考虑到了和你一样的人!<symbol>标记上的glyph属性是用于该符号的标准<symbol>实体,但用@替换了与号。
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发布于 2009-09-16 11:53:05
与XML文件一起使用的DTD不包含Oslash实体。因此,XML解析器根本不知道如何处理?,然后就会产生混乱和/或搞笑。
将HTML的命名实体( Oslash是其中的一部分)的概念与XML的命名实体(apos、lt、gt、quot、amp)的概念分开是很重要的。基本上,如果不是HTML,就没有Oslash (至少在一般情况下,一些DTD可能有Oslash,但它可能根本不是您想要的字符。
换句话说,始终使用UTF-8。一直都是。
编辑:Ö也是拉丁语-1。
发布于 2009-09-16 11:44:20
如果你有正确的编码,你不需要转义Ø (?)。试着使用unicode来确认。
如果没有办法改变尝试取消转义HTML实体的行为,请查看PHP手册。
https://stackoverflow.com/questions/1432454
复制相似问题