首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP5解析的XML输出中缺少字符

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

Stack Overflow用户
提问于 2009-09-16 11:40:15
回答 4查看 798关注 0票数 1

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

代码语言:javascript
复制
<?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; (?)这样的实体,但是下一个问题是它不能在输出中显示字符。

这是我的解析代码:

代码语言:javascript
复制
$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 (所以用一个空格..)

有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-16 13:25:33

看一下DTD,它是这样说的(但没有换行):

代码语言:javascript
复制
<!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数据实际上是这样读取的:

代码语言:javascript
复制
<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>实体,但用@替换了与号。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2009-09-16 11:44:20

如果你有正确的编码,你不需要转义&Oslash; (?)。试着使用unicode来确认。

如果没有办法改变尝试取消转义HTML实体的行为,请查看PHP手册。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1432454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档