我正在尝试将xml转换为PHP数组。问题是xml_parse_into_struct只在遇到´
之前转换字符串。我有以下代码。
$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
。
任何帮助都感激不尽。
答案 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´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´s an acute</p></body></html>
您可以看到´
已转换为其数字编码。这在XML中是有效的,命名实体不是(不是没有DTD,XSD)。
这是另一种方法,您可以使用字符串函数将所有命名实体解码为utf-8:
$html = '<p>there´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´s an acute</p>
即使您目前使用的旧扩展程序也可以使用
$html = '<p>there´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"
}
}