현재 위치: > 최신 기사 목록> simplexml_load_string은 XML 네임 스페이스를 구문 분석 할 수 없습니까? 하나의 기사에서 해결책을 이해하십시오

simplexml_load_string은 XML 네임 스페이스를 구문 분석 할 수 없습니까? 하나의 기사에서 해결책을 이해하십시오

gitbox 2025-08-10

PHP를 사용하여 XML 데이터를 처리 할 때 Simplexml_load_string은 XML 문자열을 객체 구조로 변환하여 쉽게 액세스하고 조작하는 매우 편리한 기능입니다. 그러나 네임 스페이스를 사용하여 XML을 처리 할 때 많은 개발자가 일반적인 문제를 겪습니다. Simplexml_load_string은 네임 스페이스에서 요소를 올바르게 인식하거나 액세스하지 않는 것 같습니다.

이 기사는이 문제의 원인을 심층적으로 탐색하고 한 기사에서 이해하고 해결하는 데 도움이되는 명확한 솔루션을 제공합니다.

문제가 다시 나타납니다

먼저 네임 스페이스를 포함하는 XML 문자열 인 예를 살펴 보겠습니다.

 <span><span><span class="hljs-meta">&lt;?xml version=<span class="hljs-string">"1.0"</span></span></span><span>?&gt;
</span><span><span class="hljs-tag">&lt;<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>&gt;
  </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:table</span></span></span><span>&gt;
    </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:tr</span></span></span><span>&gt;
      </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:td</span></span></span><span>&gt;Apples</span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:td</span></span></span><span>&gt;
      </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:td</span></span></span><span>&gt;Bananas</span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:td</span></span></span><span>&gt;
    </span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:tr</span></span></span><span>&gt;
  </span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:table</span></span></span><span>&gt;
</span><span><span class="hljs-tag">&lt;/<span class="hljs-name">root</span></span></span><span>&gt;
</span></span>

다음 코드를 사용하여 구문 분석하려는 경우 :

 <span><span><span class="hljs-variable">$xmlString</span></span><span> = <span class="hljs-string">&lt;&lt;&lt;XML
&lt;?xml version="1.0"?&gt;
&lt;root xmlns:h="http://www.w3.org/TR/html4/"&gt;
  &lt;h:table&gt;
    &lt;h:tr&gt;
      &lt;h:td&gt;Apples&lt;/h:td&gt;
      &lt;h:td&gt;Bananas&lt;/h:td&gt;
    &lt;/h:tr&gt;
  &lt;/h:table&gt;
&lt;/root&gt;
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>-&gt;table);
</span></span>

$ xml-> 테이블이 결과를 반환하지 않는다는 것을 알게됩니다. Simplexml_load_string은 접두사 네임 스페이스 태그 (예 : h : 테이블 )를 처리하지 않기 때문입니다.

네임 스페이스의 특성

XML에서 네임 스페이스는 요소 이름 충돌을 피하는 데 사용됩니다. 예를 들어, h의 h : 테이블은 실제로 xmlns를 가리키는 참조 접두사입니다. h = "http://www.w3.org/tr/html4/" . 이로 인해 XML이 더 확장 가능하고 조직적이지만 추가 파싱 어려움도 제공합니다.

네임 스페이스를 올바르게 처리하는 방법

SimplexMlelement 클래스에서 제공하는 children ()getNamespaces () 메소드를 사용하여 네임 스페이스가있는 요소에 액세스 할 수 있습니다.

1 단계 : 네임 스페이스를 가져옵니다

 <span><span><span class="hljs-variable">$namespaces</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</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' =&gt; 'http://www.w3.org/TR/html4/']</span></span><span>
</span></span>

2 단계 : 네임 스페이스의 자식 요소에 액세스하십시오

 <span><span><span class="hljs-variable">$h</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</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>-&gt;table-&gt;tr;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tr</span></span><span>-&gt;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>

더 나아가 : registerxpathnamespace를 사용하십시오

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>-&gt;</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>-&gt;</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 애플리케이션의 통합 기능을 향상시킬 수 있습니다. 이 기사 가이 문제를 철저히 이해하는 데 도움이되기를 바랍니다!