1

我正在尝试解析以下 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";

这是输出:

尼尔斯·比

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

有任何想法吗?

4

4 回答 4

3

查看 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
于 2009-09-16T13:25:33.393 回答
2

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

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

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

编辑:Ø 也是 latin-1。

于 2009-09-16T11:53:04.737 回答
1

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

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

于 2009-09-16T11:44:20.037 回答
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)

我想知道如何使用它与名字的内容一起制作一个完整的字符串

于 2009-09-16T13:18:55.873 回答