문자열에서 XML을로드하여 SimpleXMLElement 객체에 xpath()
을 적용하면 작동합니다. 파일에서로드 할 경우 - 빈 배열을 가져옵니다.PHP에서 xpath를 사용하면 파일에서 작동하지 않습니다.
검색중인 요소의 깊이 수준은 5입니다 (루트 노드가 1 단계라고 말하면). 때 문자열에서 xml에 - 그것은 마지막 수준에서 시작하는 xpath 표현과 함께 작동 ... 파일에서 xml에 - 아니 xpath 전혀 작동합니다. 내가합니다 (xpath()
및 적용)를 SimpleXMLElement 개체로 XML 내용을 한로드 시도
방법 :
1.
$xml = simplexml_load_file('filepath/file.xml');
$result = $xml->xpath('//Export/Product/Settings/Info[@Art="Short"]/@Something');
2.
$xmlStr = file_get_contents('filepath/file.xml');
$xml = new SimpleXMLElement($xmlStr);
$result = $xml->xpath('//Export/Product/Settings/Info[@Art="Short"]/@Something');
이 성공하지, 모두 그들 중 ... 언제 문자열에서 단지 $xml = simplexml_load_string($xmlStr);
괜찮 았는데. 나는 THIS ARTICLE을 통해 보았고 아마도 내 경우에 대해 합리적인 것으로 보이는 의견의 거의 모든 제안을 시도했습니다.
내가 알아챈 또 다른 이상한 점은 $xml
의 로그에 쓸 때 Product
(두 번째 임)의 깊이 수준에서 배열 및 객체 등의 출력을 얻을 때입니다. 그러나 파일에서로드 된 $xml
을 사용하면 루트 노드의 출력을 얻습니다. XML 코드의
간단한 표현 :
<Export>
<Product>
...a lot of other elements...
<Settings>
<Info Art="Short" Something="blahblahblah"/>
<Info Art"asda" Somethig="dsad"/>
<Info .... />
...
</Settings>
</Product>
</Export>
그래서 내 질문입니다 - 내가 파일에서 XML을로드 할 때 나는 문자열을로드 할 때 작동으로이 작업을 진행하는 방법?
P. 나는 현재 문제와 관련이 있는지 모르지만 - 문자열 (heredoc)에서로드 할 때 문자열의 첫 행이 <?xml version="1.0" encoding="UTF-8"?>
인 경우 - non-object
에 xpath()
을 호출하는 중 오류가 발생합니다. 그러나이 첫 번째 행을 제거하자마자 문자열이 루트 노드에서 시작됩니다. 모든 것이 완벽합니다.
UPDATE : 첫 번째 <Export...>
노드 :
<Export xmlns="http://something" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://something C:/some_path/some_file.xsd" GA_Vertriebsweg="2" KomplettExport="true">
UPDATE 2 : 그래서, <Export xmlns="http://www.evelopment.de/schema/katalogexport/komplett"...>
: 파일의 로딩 모든 것은 여기에서와 같이 <Export...
에 불과하기 때문에 1 속성 작동하지 않는다 전체 문제는 네임 스페이스에 있습니다.
XML에서 네임 스페이스를 사용하고 있습니까? –
tCode
@ t-coder - 첫 번째 줄 ('Export ...'노드)으로 게시물을 업데이트했습니다. 너는 그것을 볼 수있다. – Syspect
simplexml_load_file을 사용하면 네임 스페이스를 지정할 수 있습니다. 아마도 그것은 이미 그것을 해결할 것입니다. 그렇지 않다면 XML을 네임 스페이스와 함께 업로드하여 링크를 찾아보십시오. 그리고 단지 FYI 1.와 2.) 꽤 유사합니다, 당신은 단지 1을 사용할 수 있습니다.) 귀하의 경우에는 둘 사이에 차이가 없습니다. – hakre