PHP를 사용하여 XML 데이터를 처리 할 때 Simplexml_load_string은 XML 문자열을 객체 구조로 변환하여 쉽게 액세스하고 조작하는 매우 편리한 기능입니다. 그러나 네임 스페이스를 사용하여 XML을 처리 할 때 많은 개발자가 일반적인 문제를 겪습니다. Simplexml_load_string은 네임 스페이스에서 요소를 올바르게 인식하거나 액세스하지 않는 것 같습니다.
이 기사는이 문제의 원인을 심층적으로 탐색하고 한 기사에서 이해하고 해결하는 데 도움이되는 명확한 솔루션을 제공합니다.
먼저 네임 스페이스를 포함하는 XML 문자열 인 예를 살펴 보겠습니다.
<span><span><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0"</span></span></span><span>?>
</span><span><span class="hljs-tag"><<span class="hljs-name">root</span></span></span><span> </span><span><span class="hljs-attr">xmlns:h</span></span><span>=</span><span><span class="hljs-string">"http://www.w3.org/TR/html4/"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:table</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:tr</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:td</span></span></span><span>>Apples</span><span><span class="hljs-tag"></<span class="hljs-name">h:td</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:td</span></span></span><span>>Bananas</span><span><span class="hljs-tag"></<span class="hljs-name">h:td</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">h:tr</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">h:table</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">root</span></span></span><span>>
</span></span>
다음 코드를 사용하여 구문 분석하려는 경우 :
<span><span><span class="hljs-variable">$xmlString</span></span><span> = <span class="hljs-string"><<<XML
<?xml version="1.0"?>
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
</root>
XML</span>;
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$xmlString</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>->table);
</span></span>
$ xml-> 테이블이 결과를 반환하지 않는다는 것을 알게됩니다. Simplexml_load_string은 접두사 네임 스페이스 태그 (예 : h : 테이블 )를 처리하지 않기 때문입니다.
XML에서 네임 스페이스는 요소 이름 충돌을 피하는 데 사용됩니다. 예를 들어, h의 h : 테이블은 실제로 xmlns를 가리키는 참조 접두사입니다. h = "http://www.w3.org/tr/html4/" . 이로 인해 XML이 더 확장 가능하고 조직적이지만 추가 파싱 어려움도 제공합니다.
SimplexMlelement 클래스에서 제공하는 children () 및 getNamespaces () 메소드를 사용하여 네임 스페이스가있는 요소에 액세스 할 수 있습니다.
<span><span><span class="hljs-variable">$namespaces</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getNamespaces</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// 출력 결과:['h' => 'http://www.w3.org/TR/html4/']</span></span><span>
</span></span>
<span><span><span class="hljs-variable">$h</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">children</span></span><span>(</span><span><span class="hljs-variable">$namespaces</span></span><span>[</span><span><span class="hljs-string">'h'</span></span><span>]);
</span><span><span class="hljs-variable">$tr</span></span><span> = </span><span><span class="hljs-variable">$h</span></span><span>->table->tr;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tr</span></span><span>->td </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span> . PHP_EOL;
}
</span></span>
출력 결과 :
<span><span><span class="hljs-attribute">Apples</span></span><span>
Bananas
</span></span>
xpath 쿼리 메소드를 사용하여 데이터를 가져 오려면 registerxpathnamespace 메소드를 통해 네임 스페이스를 등록 할 수 있습니다.
<span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$xmlString</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">registerXPathNamespace</span></span><span>(</span><span><span class="hljs-string">'h'</span></span><span>, </span><span><span class="hljs-string">'http://www.w3.org/TR/html4/'</span></span><span>);
</span><span><span class="hljs-variable">$tds</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">xpath</span></span><span>(</span><span><span class="hljs-string">'//h:td'</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tds</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span> . PHP_EOL;
}
</span></span>
이 접근법은 의미 적으로 명확 할뿐만 아니라 복잡한 XML 구조를 다룰 때 더 유연합니다.
Simplexml_load_string을 네임 스페이스로 구문 분석하기 위해 Simplexml_load_String을 사용하는 경우, 자식 요소에 액세스 할 수없는 경우 XML이 잘못되었다고 의심하지 마십시오. children () , getNamespaces () 및 registerXPathNamespace () 메소드를 이해하고 잘 활용하면 네임 스페이스로 인한 문제를 쉽게 갈라집니다.
네임 스페이스를 처리하는 것이 약간 번거롭지 만 마스터하면 다양한 표준화 된 XML 데이터 소스에 원활하게 연결하고 PHP 애플리케이션의 통합 기능을 향상시킬 수 있습니다. 이 기사 가이 문제를 철저히 이해하는 데 도움이되기를 바랍니다!