我正在尝试解析以下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(所以有空格..)
任何想法?
答案 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阅读器,这意味着“只要您在源代码中看到这些字母的确切组合:Ø
,请将其替换为此文字:<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)
如果编码正确,则无需转义Ø
(Ø)。尝试使用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的内容