PHP xml_parse_into_struct由于'中断'

时间:2014-04-16 10:55:21

标签: php xml

我正在尝试将xml转换为PHP数组。问题是xml_parse_into_struct只在遇到&acute之前转换字符串。我有以下代码。

$xmlStr     = file_get_contents($url);
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING   , "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING      , 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE        , 1);
xml_parse_into_struct($parser, trim($contents)          , $xml_values);

当被视为HTML时,它就像there´s。 任何帮助都感激不尽。

2 个答案:

答案 0 :(得分:0)

您是否尝试过SimpleXML

e.g。

libxml_use_internal_errors(true);
$xml_string = file_get_contents($url);
$xml_string = html_entity_decode($xml_string, ENT_QUOTES, "utf-8");
$xml_data = new SimpleXMLElement($xml_string);
var_dump($xml_data); // displays object array

答案 1 :(得分:0)

´是XML中未知的命名实体,您不能将其作为纯XML加载,仅作为(X)HTML加载。

您可以使用DOMDocument加载HTML,但默认情况下,这将"修复"将文档转换为完整的html文件:

$html = '<p>there&acute;s an acute</p>';

$dom = new DOMDocument();
$dom->loadHtml($html);

echo $dom->saveXml();

输出:

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>there&#xB4;s an acute</p></body></html>

您可以看到&acute;已转换为其数字编码。这在XML中是有效的,命名实体不是(不是没有DTD,XSD)。

这是另一种方法,您可以使用字符串函数将所有命名实体解码为utf-8:

$html = '<p>there&acute;s an acute</p>';

$namedEntities = array_flip(
  array_diff(
    get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'),
    get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8')
  )
);
$xml = strtr($html, $namedEntities);

$dom = new DOMDocument();
$dom->loadXml($xml);

echo $dom->saveXml();

输出:

<?xml version="1.0"?>
<p>there&#xB4;s an acute</p>

即使您目前使用的旧扩展程序也可以使用

$html = '<p>there&acute;s an acute</p>';

$namedEntities = array_flip(
  array_diff(
    get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'),
    get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8')
  )
);

$xml = strtr($html, $namedEntities);

$parser = xml_parser_create ('utf-8');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $xml, $xml_values);

var_dump($xml_values);

输出:

array(1) {
  [0]=>
  array(4) {
    ["tag"]=>
    string(1) "p"
    ["type"]=>
    string(8) "complete"
    ["level"]=>
    int(1)
    ["value"]=>
    string(17) "there´s an acute"
  }
}