代码之家  ›  专栏  ›  技术社区  ›  Maarten

使用php5分析的XML输出中缺少字符

  •  0
  • Maarten  · 技术社区  · 17 年前

    我正在尝试分析以下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 回复  |  直到 13 年前
        1
  •  2
  •   nickf    17 年前

    看一下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 属性 <符号& GT; 标记是用于该符号的标准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
  •  2
  •   Williham Totland    17 年前

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

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

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

    编辑:_也是拉丁语-1。

        3
  •  1
  •   Cem Kalyoncu    17 年前

    如果你有正确的编码,你不需要逃避 &Oslash; (_)。请尝试使用Unicode来确定。

    如果无法更改行为,请尝试取消对HTML实体的捕获,查看PHP手册。

        4
  •  0
  •   Maarten    17 年前

    好的,再进一步,如果我用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)
    

    我想知道我怎么能用它和名字的内容组成一个完整的字符串

    推荐文章