PHP용 최적의 XML 파서
이전에 XML 파서를 사용해 본 적이 있습니다만, 일반적으로는 마음에 들지 않고, 기본적인 기능에 대응하고 있는 것처럼 느껴졌습니다.
최근에 SimpleXML을 봤는데 아직 안 해봤어요.좀 더 간단한가요?둘 다 어떤 장점과 단점이 있나요?다른 파서는 써본 적 없어요?
처음에는 확장자이고 C로 쓰여져 있고 매우 빠르기 때문에 SimpleXML이 케익을 가져간다고 해야 할 수 밖에 없습니다.그러나 두 번째로 해석된 문서는 PHP 객체의 형태를 취합니다.그래서 '쿼리'를 할 수 있습니다.$root->myElement
.
PHP에서 사용할 수 있는 XML 확장자를 확인하십시오.
XML 파서와 SimpleX의 주요 차이점ML은 후자가 풀 파서가 아니라는 것입니다.심플XML은 DOM 확장자 위에 구축되어 XML 파일 전체를 메모리에 로드합니다.XMLReader와 같은 XML 파서는 현재 노드만 메모리에 로드합니다.파서가 특정 노드를 발견하면 트리거되는 핸들러를 정의합니다.그것은 더 빠르고 메모리를 절약한다.당신은 XPath를 사용할 수 없는 상태에서 비용을 지불합니다.
개인적으로 SimpleXml은 DOM을 통해 제공되는 기능이 상당히 제한적입니다(따라서 단순합니다.DOM과 SimpleXml을 쉽게 전환할 수 있지만, 저는 보통 번거롭게 DOM 루트를 직접 이용하지 않습니다.DOM은 W3C DOM API를 구현한 것이기 때문에 JavaScript 등 다른 언어에서도 친숙할 수 있습니다.
확장자를 사용할 수 없는 경우 빠르고 쉬운 XML 해석에 도움이 되는 함수입니다.
<?php
/**
* Convert XML to an Array
*
* @param string $XML
* @return array
*/
function XMLtoArray($XML)
{
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $XML, $vals);
xml_parser_free($xml_parser);
// wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
$_tmp='';
foreach ($vals as $xml_elem) {
$x_tag=$xml_elem['tag'];
$x_level=$xml_elem['level'];
$x_type=$xml_elem['type'];
if ($x_level!=1 && $x_type == 'close') {
if (isset($multi_key[$x_tag][$x_level]))
$multi_key[$x_tag][$x_level]=1;
else
$multi_key[$x_tag][$x_level]=0;
}
if ($x_level!=1 && $x_type == 'complete') {
if ($_tmp==$x_tag)
$multi_key[$x_tag][$x_level]=1;
$_tmp=$x_tag;
}
}
// jedziemy po tablicy
foreach ($vals as $xml_elem) {
$x_tag=$xml_elem['tag'];
$x_level=$xml_elem['level'];
$x_type=$xml_elem['type'];
if ($x_type == 'open')
$level[$x_level] = $x_tag;
$start_level = 1;
$php_stmt = '$xml_array';
if ($x_type=='close' && $x_level!=1)
$multi_key[$x_tag][$x_level]++;
while ($start_level < $x_level) {
$php_stmt .= '[$level['.$start_level.']]';
if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
$php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
$start_level++;
}
$add='';
if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) {
if (!isset($multi_key2[$x_tag][$x_level]))
$multi_key2[$x_tag][$x_level]=0;
else
$multi_key2[$x_tag][$x_level]++;
$add='['.$multi_key2[$x_tag][$x_level].']';
}
if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) {
if ($x_type == 'open')
$php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
else
$php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
eval($php_stmt_main);
}
if (array_key_exists('attributes', $xml_elem)) {
if (isset($xml_elem['value'])) {
$php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
eval($php_stmt_main);
}
foreach ($xml_elem['attributes'] as $key=>$value) {
$php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
eval($php_stmt_att);
}
}
}
return $xml_array;
}
?>
안녕하세요, SimpleXml은 매우 유용하다고 생각합니다.그리고 저는 xpath를 사용하고 있습니다.
$xml = simplexml_load_file("som_xml.xml");
$blocks = $xml->xpath('//block'); //gets all <block/> tags
$blocks2 = $xml->xpath('//layout/block'); //gets all <block/> which parent are <layout/> tags
"xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml Configuration" "xml 설정" SimpleXml
라고 써있는데요.C
굉장히 빨라요.
XML 파일을 사용하여 수행하려는 작업에 따라 달라집니다.XML 파일(컨피규레이션파일 등)을 읽으려고 하는 경우 SimpleX를 권장하는 것은 Wicked Flee가 옳습니다.ML은 중첩된 ArrayObjects에 해당하는 양을 생성하기 때문에 $xml->root->자녀가 값에 액세스할 수 있습니다.
XML 파일을 조작하는 경우는, DOM XML 를 사용하는 것이 좋습니다.
crxml 파서는 파서가 매우 간단합니다.
이 클래스에는 네임스페이스가 있는 노드 이름을 인수로 사용하는 검색 함수가 있습니다.xml에서 노드를 검색하고 access 문을 출력하여 이 클래스를 사용하여 해당 노드에 액세스합니다.또한 이 클래스는 xml 생성을 매우 쉽게 합니다.
이 클래스는 다음 사이트에서 다운로드 할 수 있습니다.
http://freshmeat.net/projects/crxml
또는 phpclasses.org에서 문의해 주십시오.
http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html
언급URL : https://stackoverflow.com/questions/188414/best-xml-parser-for-php
'source' 카테고리의 다른 글
Java ThreadLocal 변수가 정적이어야 하는 이유 (1) | 2022.09.25 |
---|---|
Maria에서 다중 마스터 복제 오류를 수정하는 방법DB (0) | 2022.09.18 |
여러 OR에 대해 인덱스를 사용하는 MySQL이지만 IN에 대한 인덱스는 없으며 속도가 매우 느립니다. (0) | 2022.09.18 |
JUnit assertEquals(예상치 2배, 실제치 2배, 엡실론 2배) (0) | 2022.09.18 |
PHP에서 HTML 폼 입력 기본값을 올바르게 이스케이프하려면 어떻게 해야 합니까? (0) | 2022.09.18 |