현재 위치: > 최신 기사 목록> PHP XPath 기능은 항상 오류를보고합니까? 이러한 일반적인 구문 오류 및 솔루션을 확인하십시오

PHP XPath 기능은 항상 오류를보고합니까? 이러한 일반적인 구문 오류 및 솔루션을 확인하십시오

gitbox 2025-09-09

PHP XPath 기능은 항상 오류를보고합니까? 이러한 일반적인 구문 오류 및 솔루션을 확인하십시오

PHP의 XPath 함수를 사용할 때 많은 개발자들이 다양한 오류, 특히 XPath 구문 관련 문제에 직면하게됩니다. XPath는 XML 문서에서 데이터를 찾는 데 사용되는 언어입니다. PHP와 함께 사용하면 강력한 쿼리 기능이 데이터 추출 프로세스를 크게 단순화 할 수 있습니다. 그러나 구문과 사용의 세부 사항으로 인해 종종 오류와 문제가 발생합니다. 이 기사는 PHP의 XPath 기능을 더 잘 사용하는 데 도움이되기를 희망하면서 몇 가지 일반적인 XPath 오류 및 해당 솔루션을 공유합니다.

1. XML 문서가 유효한지 확인하십시오

가장 일반적인 실수 중 하나는 XML을 처리 할 때 XML 파일이 올바르게로드되지 않는다는 것입니다. 이 문제로 인해 XPath 함수가 XML 문서를 올바르게 구문 분석하지 못하여 오류 또는 빈 결과를 반환 할 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
</span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">load</span></span><span>(</span><span><span class="hljs-string">'invalid.xml'</span></span><span>);  </span><span><span class="hljs-comment">// 읽지 못했습니다XML문서</span></span><span>
</span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span></span>

해결책:

먼저 XML 파일의 경로가 올바르고 XML 파일 자체가 유효한지 확인하십시오. XML 파일이 올바르게로드되었는지 확인할 수 있습니다.

 <span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">load</span></span><span>(</span><span><span class="hljs-string">'valid.xml'</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'XML문서加载失败'</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span></span>

2. XPath 표현 오류

XPath 구문 자체도 비교적 엄격하며 약간 부주의하면 오류가 발생합니다. XPath 표현식에 구문 오류가 있으면 Query () 메소드가 False를 반환하고 예상 결과를 생성하지 않습니다.

Error example:

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'book[@category="PHP"'</span></span><span>);  </span><span><span class="hljs-comment">// 괄호는 닫히지 않았습니다</span></span><span>
</span></span>

해결책:

XPath 표현식을 확인하여 괄호, 따옴표, 슬래시 및 기타 기호와 같은 기호가 올바르게 페어링되어 있는지 확인하십시오. 예를 들어:

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book[@category="PHP"]'</span></span><span>);
</span></span>

3. 네임 스페이스를 사용할 때 처리

XML로 작업 할 때 XML 문서에 네임 스페이스를 사용하는 경우 XPath 쿼리가 실패 할 수 있습니다. 기본적으로 XPath는 네임 스페이스를 고려하지 않기 때문입니다.

Error example:

 <span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
</span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">loadXML</span></span><span>(</span><span><span class="hljs-string">'&lt;root xmlns:ns="http://example.com"&gt;&lt;ns:book&gt;Title&lt;/ns:book&gt;&lt;/root&gt;'</span></span><span>);
</span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//ns:book'</span></span><span>);
</span></span>

해결책:

DOMXPATH를 인스턴스화 할 때 RegisterNamespace 메소드를 사용하여 네임 스페이스 문제를 해결하기 위해 네임 스페이스를 등록 할 수 있습니다.

 <span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
</span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">loadXML</span></span><span>(</span><span><span class="hljs-string">'&lt;root xmlns:ns="http://example.com"&gt;&lt;ns:book&gt;Title&lt;/ns:book&gt;&lt;/root&gt;'</span></span><span>);
</span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">registerNamespace</span></span><span>(</span><span><span class="hljs-string">'ns'</span></span><span>, </span><span><span class="hljs-string">'http://example.com'</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//ns:book'</span></span><span>);
</span></span>

4. Query () 메소드의 리턴 값 처리

xpath-> query () 메소드는 domnodelist 객체를 반환합니다. 쿼리가 성공하더라도 결과는 비어 있고 결과 판단이 이루어져야합니다.

Error example:

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)-&gt;nodeValue;  </span><span><span class="hljs-comment">// 노드가 없기 때문에 오류 가보고 될 수 있습니다.</span></span><span>
</span></span>

해결책:

쿼리 결과에 액세스하기 전에 다음이 있는지 확인하십시오.

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>-&gt;length &gt; </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)-&gt;nodeValue;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'일치하는 노드가 발견되지 않았습니다'</span></span><span>;
}
</span></span>

5. 인덱싱 문제 query ()를 사용하여 결과를 반환 할 때

domnodelist 객체는 객체 배열이므로 노드에 액세스 할 때 올바른 색인이 필요합니다. 일반적인 실수는 경계를 벗어난 색인의 길이 또는 결과를 확인하지 않는다는 것입니다.

Error example:

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>)-&gt;nodeValue;  </span><span><span class="hljs-comment">// 쿼리 결과가 더 적은 경우10하나의 노드,코드는 오류를보고합니다</span></span><span>
</span></span>

해결책:

인덱스가 유효한 범위 내에 있는지 확인하려면 DomNodelist 객체의 길이를 확인하십시오.

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>-&gt;length &gt; </span><span><span class="hljs-number">10</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>)-&gt;nodeValue;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'노드가 충분하지 않습니다'</span></span><span>;
}
</span></span>

6. 쿼리 조건이 너무 복잡합니다

XPath 표현식이 너무 복잡한 경우, 특히 여러 조건 또는 복잡한 논리를 포함하는 경우 XPath는 오류를보고하거나 잘못된 결과를 반환 할 수 있습니다. 이 경우 쿼리 또는 단계별 디버깅을 단순화 할 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book[@category="PHP" and @author="John"]'</span></span><span>);
</span></span>

해결책:

XPath 표현식을 단순화하고 점차적으로 조건을 추가하고 디버깅하여 각 조건이 유효한지 확인하십시오.

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book[@category="PHP"]'</span></span><span>);  </span><span><span class="hljs-comment">// 먼저 단일 조건을 확인하십시오</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book[@category="PHP" and @author="John"]'</span></span><span>);  </span><span><span class="hljs-comment">// 두 번째 조건을 추가하십시오</span></span><span>
</span></span>

7. query () 메소드에 의해 반환되지 않은 객체

domnodelist 는 배열 객체이지만 배열과 정확히 동일하지 않습니다. 경우에 따라 배열처럼 직접 액세스하거나 처리 할 수 ​​없습니다. 이 문제를 해결하기 위해 먼저 DomNodelist를 배열로 변환 할 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$node</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$node</span></span><span>-&gt;nodeValue;  </span><span><span class="hljs-comment">// 오류가 발생합니다</span></span><span>
}
</span></span>

해결책:

DomNodelist를 배열 및 루프로 변환하십시오.

 <span><span><span class="hljs-variable">$xpath</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMXPath</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$xpath</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'//book'</span></span><span>);
</span><span><span class="hljs-variable">$nodes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_to_array</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);  </span><span><span class="hljs-comment">// 배열로 변환하십시오</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$nodes</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$node</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$node</span></span><span>-&gt;nodeValue;
}
</span></span>