Php 菲律宾元';无法将无效的XML加载到DOM文档中

Php 菲律宾元';无法将无效的XML加载到DOM文档中,php,xml,Php,Xml,我有一个xml文件,其标题如下: <!ENTITY nbsp "&#160;"><!-- no-break space = non-breaking space, U+00A0 ISOnum --> <!ENTITY iexcl "&#161;"><!-- inverted exclamation mark, U+00A1 ISOnum --> <

我有一个xml文件,其标题如下:

<!ENTITY nbsp   "&#160;"><!-- no-break space = non-breaking space,
                                   U+00A0 ISOnum -->
 <!ENTITY iexcl  "&#161;"><!-- inverted exclamation mark, U+00A1 ISOnum -->
 <!ENTITY cent   "&#162;"><!-- cent sign, U+00A2 ISOnum -->
 <!ENTITY pound  "&#163;"><!-- pound sign, U+00A3 ISOnum -->
 <!ENTITY curren "&#164;"><!-- currency sign, U+00A4 ISOnum -->
 <!ENTITY yen    "&#165;"><!-- yen sign = yuan sign, U+00A5 ISOnum -->
 <!ENTITY brvbar "&#166;"><!-- broken bar = broken vertical bar,
                                   U+00A6 ISOnum -->
 <!ENTITY sect   "&#167;"><!-- section sign, U+00A7 ISOnum -->
 <!ENTITY uml    "&#168;"><!-- diaeresis = spacing diaeresis,
                                   U+00A8 ISOdia -->
 <!ENTITY copy   "&#169;"><!-- copyright sign, U+00A9 ISOnum -->
 <!ENTITY ordf   "&#170;"><!-- feminine ordinal indicator, U+00AA ISOnum -->
 <!ENTITY laquo  "&#171;"><!-- left-pointing double angle quotation mark
                                   = left pointing guillemet, U+00AB ISOnum -->
 <!ENTITY not    "&#172;"><!-- not sign, U+00AC ISOnum -->
 <!ENTITY shy    "&#173;"><!-- soft hyphen = discretionary hyphen,
                                   U+00AD ISOnum -->
 <!ENTITY reg    "&#174;"><!-- registered sign = registered trade mark sign,
                                   U+00AE ISOnum -->
 <!ENTITY macr   "&#175;"><!-- macron = spacing macron = overline
                                   = APL overbar, U+00AF ISOdia -->
 <!ENTITY deg    "&#176;"><!-- degree sign, U+00B0 ISOnum -->
 <!ENTITY plusmn "&#177;"><!-- plus-minus sign = plus-or-minus sign,
                                   U+00B1 ISOnum -->

您可能对此感兴趣,但您需要将所有合法标记列为白名单。

您的代码没有导致解析错误(如果启用错误日志记录或报告,很可能不会,您可能会看到警告,但我认为情况并非如此)

相反,您的代码会加载,并且由于默认情况下XML是UTF-8编码的,因此您使用的所有实体都不必传输,因为XML可以包含这些实体的字符,而不需要这些字符

因此,XML中的定义和实体本身都是多余的。我想,
DOMDocument
只会删除这些


此外,如果您为测试目的提供了一个示例XML块,您将得到一个更具体的答案来满足您的澄清需求。

应该如何帮助
fgetss
呢?在我看来,OP希望删除所有
标记,他称之为标题。那么
fgetss
应该如何帮助这一点呢?另外,
strip_标记
将删除所有元素,这对于XML文档来说有点愚蠢。OP必须提供所有允许的元素,这有点尴尬,你不这么认为吗?此外,当实体未声明时,当这些实体在XML文档中引用时,会不会导致更多的解析错误?
strip\u tags
有一个白名单参数,我从来没有在没有该参数的情况下使用过它。至于
fgetss
我想他可以用它来剥离所需的标签,但阅读手册我发现情况并非如此。我将从我的答案中删除它。谢谢你帮助我改进答案,Gordon。“标题”是实体的声明。如果XML文档后面有对这些实体的引用,那么如果文档应该解析为XML,则不能删除声明。
$xml = curl_exec($ch);
$srcDom = new DOMDocument;
$srcDom->load($xml);
$xPath = new DOMXPath($srcDom);
foreach ($srcDom->getElementsByTagName('Venue') as $venue) {
    $dstDom = new DOMDocument('1.0', 'utf-8');
    $dstDom->appendChild($dstDom->createElement('EventsPricePoints'));
    $dstDom->documentElement->appendChild($dstDom->importNode($venue, true));

    $allEventsForVenue = $xPath->query(
        sprintf(
            '/Store/EventsPricePoints/Event[VenueID/@ID=%d]',
            $venue->getAttribute('ID')
        )
    );

    foreach ($allEventsForVenue as $event) {
        $dstDom->documentElement->appendChild($dstDom->importNode($event, true));
    }

    $dstDom->formatOutput = true;
    $dstDom->saveXml(sprintf('/var/www/html/venuexml/%d.xml', $venue->getAttribute('ID')));
}