PHP에서 XMLReader를 사용하는 방법
아래 XML 파일을 가지고 있습니다.파일이 꽤 크고, 파일을 열고 읽을 수 있는 simplexml을 얻을 수 없어서 XMLReader를 시도하고 있지만 php에서는 성공하지 못했습니다.
<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
<last_updated>2009-11-30 13:52:40</last_updated>
<product>
<element_1>foo</element_1>
<element_2>foo</element_2>
<element_3>foo</element_3>
<element_4>foo</element_4>
</product>
<product>
<element_1>bar</element_1>
<element_2>bar</element_2>
<element_3>bar</element_3>
<element_4>bar</element_4>
</product>
</products>
안타깝게도 PHP에 대한 좋은 튜토리얼을 찾을 수 없었습니다.또, 각 요소의 컨텐츠를 데이타베이스에 보존하는 방법을 알고 싶습니다.
일의 단위가 어느 정도냐에 따라 다르겠지만, 내 생각에 당신은 각각을 다루려고 하는 것 같아요.<product/>
노드가 연속됩니다.
이를 위해 가장 간단한 방법은 XMLReader를 사용하여 각 노드에 액세스한 후 SimpleXML을 사용하는 것입니다.이렇게 하면 한 번에 하나의 노드를 처리하면서 SimpleX를 활용할 수 있기 때문에 메모리 사용량을 낮게 유지할 수 있습니다.ML의 사용 편의성예:
$z = new XMLReader;
$z->open('data.xml');
$doc = new DOMDocument;
// move to the first <product /> node
while ($z->read() && $z->name !== 'product');
// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'product')
{
// either one should work
//$node = new SimpleXMLElement($z->readOuterXML());
$node = simplexml_import_dom($doc->importNode($z->expand(), true));
// now you can use $node without going insane about parsing
var_dump($node->element_1);
// go to next <product />
$z->next('product');
}
다양한 접근방식의 장단점을 간단히 설명합니다.
XMLReader만
장점: 고속, 메모리 사용량 감소
단점: 쓰기 및 디버깅이 지나치게 어려우며 유용한 작업을 수행하려면 많은 사용자 코드 필요.Userland 코드가 느리고 오류가 발생하기 쉽습니다.게다가 관리해야 할 코드 행이 늘어납니다.
XMLReader + SimpleXML
장점: 메모리(한 노드 처리에 필요한 메모리만)와 SimpleX를 많이 사용하지 않음ML은 이름에서 알 수 있듯이 매우 사용하기 쉽습니다.
단점: 각 노드에 대한 SimpleXMlement 개체를 만드는 속도가 그리 빠르지 않습니다.문제가 있는지 어떤지를 이해하려면 벤치마크를 해야 합니다.단, 보통 머신이라도 초당 1,000개의 노드를 처리할 수 있습니다.
XMLReader + DOM
장점: SimpleXML 만큼 메모리를 사용하며 XMLReader::expand()는 새로운 SimpleXMLlement를 작성하는 것보다 빠릅니다.사용할 수 있으면 좋겠는데
simplexml_import_dom()
하지만 그런 경우에는 효과가 없는 것 같습니다.단점: DOM은 사용하기 귀찮다.XMLReader와 SimpleXML의 중간 지점에 있습니다.XMLReader만큼 복잡하고 어색하지는 않지만 SimpleXML을 사용하는 것은 몇 년밖에 되지 않습니다.
조언: SimpleXML을 사용하여 프로토타입을 작성하여 고객에게 적합한지 확인하십시오.퍼포먼스가 가장 중요한 경우는, DOM 를 사용해 주세요.XMLReader에서 가능한 한 멀리 떨어져 있어야 합니다.코드를 많이 쓸수록 버그가 발생하거나 성능 저하가 발생할 가능성이 높아집니다.
특성으로 포맷된 xml의 경우...
data.xml:
<building_data>
<building address="some address" lat="28.902914" lng="-71.007235" />
<building address="some address" lat="48.892342" lng="-75.0423423" />
<building address="some address" lat="58.929753" lng="-79.1236987" />
</building_data>
php 코드:
$reader = new XMLReader();
if (!$reader->open("data.xml")) {
die("Failed to open 'data.xml'");
}
while($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'building') {
$address = $reader->getAttribute('address');
$latitude = $reader->getAttribute('lat');
$longitude = $reader->getAttribute('lng');
}
$reader->close();
받아들여진 답변은 나에게 좋은 출발을 주었지만, 내가 원하는 것보다 더 많은 수업과 과정을 가져왔다. 그래서 나의 해석은 다음과 같다.
$xml_reader = new XMLReader;
$xml_reader->open($feed_url);
// move the pointer to the first product
while ($xml_reader->read() && $xml_reader->name != 'product');
// loop through the products
while ($xml_reader->name == 'product')
{
// load the current xml element into simplexml and we’re off and running!
$xml = simplexml_load_string($xml_reader->readOuterXML());
// now you can use your simpleXML object ($xml).
echo $xml->element_1;
// move the pointer to the next product
$xml_reader->next('product');
}
// don’t forget to close the file
$xml_reader->close();
XML 구문 분석 수명의 대부분은 XML(Amazon MWS) 트럭에서 유용한 정보 덩어리를 추출하는 데 소비됩니다.따라서 제 답변은 귀하가 특정 정보만을 원하며 그 위치가 어디인지 알고 있다고 가정합니다.
XMLReader를 사용하는 가장 쉬운 방법은 정보를 원하는 태그를 알고 사용하는 것입니다.XML의 구조를 알고 있고 고유한 태그가 많다면 첫 번째 케이스를 사용하는 것이 쉽다고 생각합니다.케이스 2와 3은 보다 복잡한 태그에 대한 처리 방법을 보여 줍니다.이것은 매우 빠릅니다.PHP에서 가장 빠른 XML 파서는 무엇입니까?에 대해 논의하겠습니다.
태그 을 할 때 해야 할 은 '태그 기반 해석'을 사용하는 입니다.if ($myXML->nodeType == XMLReader::ELEMENT) {...
것이 - 닫힘 노드 같은 것이 없습니다.스페이스나 클로즈노드 등은 취급하지 않습니다.
function parseMyXML ($xml) { //pass in an XML string
$myXML = new XMLReader();
$myXML->xml($xml);
while ($myXML->read()) { //start reading.
if ($myXML->nodeType == XMLReader::ELEMENT) { //only opening tags.
$tag = $myXML->name; //make $tag contain the name of the tag
switch ($tag) {
case 'Tag1': //this tag contains no child elements, only the content we need. And it's unique.
$variable = $myXML->readInnerXML(); //now variable contains the contents of tag1
break;
case 'Tag2': //this tag contains child elements, of which we only want one.
while($myXML->read()) { //so we tell it to keep reading
if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') { // and when it finds the amount tag...
$variable2 = $myXML->readInnerXML(); //...put it in $variable2.
break;
}
}
break;
case 'Tag3': //tag3 also has children, which are not unique, but we need two of the children this time.
while($myXML->read()) {
if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') {
$variable3 = $myXML->readInnerXML();
break;
} else if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Currency') {
$variable4 = $myXML->readInnerXML();
break;
}
}
break;
}
}
}
$myXML->close();
}
Simple example:
public function productsAction()
{
$saveFileName = 'ceneo.xml';
$filename = $this->path . $saveFileName;
if(file_exists($filename)) {
$reader = new XMLReader();
$reader->open($filename);
$countElements = 0;
while($reader->read()) {
if($reader->nodeType == XMLReader::ELEMENT) {
$nodeName = $reader->name;
}
if($reader->nodeType == XMLReader::TEXT && !empty($nodeName)) {
switch ($nodeName) {
case 'id':
var_dump($reader->value);
break;
}
}
if($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'offer') {
$countElements++;
}
}
$reader->close();
exit(print('<pre>') . var_dump($countElements));
}
}
XMLReader는 다음 항목에 대해 잘 문서화되어 있습니다. PHP 사이트이것은 XML Pull 파서로, 지정된 XML 문서의 노드(또는 DOM 노드)를 통해 반복하는 데 사용됩니다.예를 들어, 제공한 문서 전체를 다음과 같이 검토할 수 있습니다.
<?php
$reader = new XMLReader();
if (!$reader->open("data.xml"))
{
die("Failed to open 'data.xml'");
}
while($reader->read())
{
$node = $reader->expand();
// process $node...
}
$reader->close();
?>
다음으로 XMLReader::expand()에 의해 반환되는 노드의 처리 방법을 결정합니다.
보다 빠르고 효율적으로 기능
<html>
<head>
<script>
function showRSS(str) {
if (str.length==0) {
document.getElementById("rssOutput").innerHTML="";
return;
}
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (this.readyState==4 && this.status==200) {
document.getElementById("rssOutput").innerHTML=this.responseText;
}
}
xmlhttp.open("GET","getrss.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<select onchange="showRSS(this.value)">
<option value="">Select an RSS-feed:</option>
<option value="Google">Google News</option>
<option value="ZDN">ZDNet News</option>
<option value="job">Job</option>
</select>
</form>
<br>
<div id="rssOutput">RSS-feed will be listed here...</div>
</body>
</html>
**백엔드 파일**
<?php
//get the q parameter from URL
$q=$_GET["q"];
//find out which feed was selected
if($q=="Google") {
$xml=("http://news.google.com/news?ned=us&topic=h&output=rss");
} elseif($q=="ZDN") {
$xml=("https://www.zdnet.com/news/rss.xml");
}elseif($q == "job"){
$xml=("https://ngcareers.com/feed");
}
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
//get elements from "<channel>"
$channel=$xmlDoc->getElementsByTagName('channel')->item(0);
$channel_title = $channel->getElementsByTagName('title')
->item(0)->childNodes->item(0)->nodeValue;
$channel_link = $channel->getElementsByTagName('link')
->item(0)->childNodes->item(0)->nodeValue;
$channel_desc = $channel->getElementsByTagName('description')
->item(0)->childNodes->item(0)->nodeValue;
//output elements from "<channel>"
echo("<p><a href='" . $channel_link
. "'>" . $channel_title . "</a>");
echo("<br>");
echo($channel_desc . "</p>");
//get and output "<item>" elements
$x=$xmlDoc->getElementsByTagName('item');
$count = $x->length;
// print_r( $x->item(0)->getElementsByTagName('title')->item(0)->nodeValue);
// print_r( $x->item(0)->getElementsByTagName('link')->item(0)->nodeValue);
// print_r( $x->item(0)->getElementsByTagName('description')->item(0)->nodeValue);
// return;
for ($i=0; $i <= $count; $i++) {
//Title
$item_title = $x->item(0)->getElementsByTagName('title')->item(0)->nodeValue;
//Link
$item_link = $x->item(0)->getElementsByTagName('link')->item(0)->nodeValue;
//Description
$item_desc = $x->item(0)->getElementsByTagName('description')->item(0)->nodeValue;
//Category
$item_cat = $x->item(0)->getElementsByTagName('category')->item(0)->nodeValue;
echo ("<p>Title: <a href='" . $item_link
. "'>" . $item_title . "</a>");
echo ("<br>");
echo ("Desc: ".$item_desc);
echo ("<br>");
echo ("Category: ".$item_cat . "</p>");
}
?>
언급URL : https://stackoverflow.com/questions/1835177/how-to-use-xmlreader-in-php
'IT' 카테고리의 다른 글
테이블에 스프링 부트 JPA 삽입(대문자 이름, 휴지 상태) (0) | 2023.01.01 |
---|---|
Vuex + 타입 스크립트 (0) | 2023.01.01 |
Python에서 .mat 파일 읽기 (0) | 2023.01.01 |
스크립트 태그 내에서 CDATA 섹션은 언제 필요합니까? (0) | 2023.01.01 |
MySQL에서 INDEX, PARMY, UNIQURE, FULLTEXT의 차이점 (0) | 2023.01.01 |