Análise de XML com aspas simples?
-
02-07-2019 - |
Pergunta
Atualmente, estou correndo em um problema onde um elemento está voltando de meu arquivo xml com uma aspa simples nele. Isso está causando xml_parse para dividi-lo em vários pedaços, exemplo: Get Wired, Está contratado! É então enterpreted como 'Get Wired, You' sendo um objeto, o apóstrofo sendo um segundo, e 're contratado!' como um terceiro.
O que eu quero fazer é:
while($data = fread($fp, 4096)){
if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
break;
}
}
Mas que mantém quebra. Posso executar um str_replace no lugar de htmlentities e funciona sem problema, mas não quer com htmlentities.
Todas as idéias?
Update: De acordo com a resposta de JimmyJ abaixo, tentei a seguinte solução sem sorte (FYI há uma resposta ou dois acima do post vinculado que atualizar o código que está ligada diretamente):
function XMLEntities($string)
{
$string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
return $string;
}
function _privateXMLEntities($num)
{
$chars = array(
39 => ''',
128 => '€',
130 => '‚',
131 => 'ƒ',
132 => '„',
133 => '…',
134 => '†',
135 => '‡',
136 => 'ˆ',
137 => '‰',
138 => 'Š',
139 => '‹',
140 => 'Œ',
142 => 'Ž',
145 => '‘',
146 => '’',
147 => '“',
148 => '”',
149 => '•',
150 => '–',
151 => '—',
152 => '˜',
153 => '™',
154 => 'š',
155 => '›',
156 => 'œ',
158 => 'ž',
159 => 'Ÿ');
$num = ord($num);
return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
}
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
break;
}
Update:. como por questão de tom abaixo, magic quotes é / foi, de fato desligado
Solução: O que eu acabei fazendo para resolver o problema é o seguinte:
Depois de recolher os dados para cada indivíduo artigo / post / etc, eu armazenar os dados para uma matriz que eu uso mais tarde para a saída, em seguida, desmarque as variáveis ??locais utilizados durante a coleta. Eu adicionado num passo que verifica se os dados já está presente, e, se for, eu concatenar-lo para o efeito, em vez de substituir-lo.
Então, se eu acabar com três pedaços (como acima, vamos ficar com 'Get Wired, Está contratado!', Eu, então, ir de fazer
$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'
Para fazer:
$x = 'Get Wired, You' . "'" . 're Hired!'
Esta não é a melhor solução, mas parece estar funcionando.
Solução
Por que você não usar algo como simplexml_load_file para analisar o seu arquivo facilmente?
Outras dicas
Eu acho que ter magic quotes habilitado pode atrapalhar xml analisar algumas vezes - é isso permitiu ?. Você pode desativar esta em tempo de execução usando
set_magic_quotes_runtime(0);
Edit: isso pode não ser relevante se a fonte não é POST ou GET, mas eu li no manual do PHP que poderia causar um comportamento estranho de qualquer maneira