XML을 단일 따옴표로 구문 분석 하시겠습니까?
-
02-07-2019 - |
문제
현재 XML 파일에서 요소가 단일 인용문으로 돌아 오는 문제가 발생하고 있습니다. 이로 인해 XML_PARSE가 여러 덩어리로 분해하게됩니다. 예 : 유선을 잡으십시오. 그런 다음 '유선, 당신은 하나의 객체, 단일 인용문은 두 번째이며'다시 고용되었습니다! ' 세 번째로.
내가하고 싶은 것은 :
while($data = fread($fp, 4096)){
if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
break;
}
}
그러나 그것은 계속 깨지고 있습니다. 나는 htmlentities 대신에 str_replace를 실행할 수 있으며 문제없이 실행되지만 htmlentities를 원하지 않습니다.
어떤 아이디어?
업데이트:아래의 Jimmyj의 응답에 따르면, 나는 운이없는 다음 솔루션을 시도했습니다 (fyi는 직접 연결된 코드를 업데이트하는 링크 된 게시물 위에 응답이 있습니다).
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;
}
업데이트: 아래의 Tom의 질문에 따라, 마법의 인용문은 실제로 꺼졌습니다.
해결책: 문제를 해결하기 위해 내가 한 일은 다음과 같습니다.
각 개별 항목/게시물/등에 대한 데이터를 수집 한 후 해당 데이터를 나중에 출력에 사용하는 배열에 저장 한 다음 컬렉션 중에 사용되는 로컬 변수를 지 웁니다. 데이터가 이미 존재하는지 확인하는 단계를 추가했으며, 그렇다면, 그것을 덮어 쓰지 않고 끝까지 연결합니다.
그래서, 내가 세 개의 덩어리로 끝나면 (위와 같이, '유선을 잡아라, 당신은 고용되었습니다!'
$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'
하기 위해 :
$x = 'Get Wired, You' . "'" . 're Hired!'
이것은 최적의 솔루션이 아니지만 작동하는 것으로 보입니다.
해결책
simplexml_load_file과 같은 것을 사용하여 파일을 쉽게 구문 분석하지 않겠습니까?
다른 팁
마법 인용문이 활성화되어있는 경우 가끔 XML 구문 분석을 엉망으로 만들 수 있다고 생각합니다. 런타임을 사용하여이를 비활성화 할 수 있습니다
set_magic_quotes_runtime(0);
편집 : 소스가 게시되거나 얻지 못한 경우 관련이 없을 수도 있지만 PHP 매뉴얼에서 어쨌든 홀수 동작을 일으킬 수 있다는 것을 읽었습니다.