2013-10-18 1 views
0

문자열에서 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-objectxpath()을 호출하는 중 오류가 발생합니다. 그러나이 첫 번째 행을 제거하자마자 문자열이 루트 노드에서 시작됩니다. 모든 것이 완벽합니다.

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 속성 작동하지 않는다 전체 문제는 네임 스페이스에 있습니다.

+0

XML에서 네임 스페이스를 사용하고 있습니까? tCode

+0

@ t-coder - 첫 번째 줄 ('Export ...'노드)으로 게시물을 업데이트했습니다. 너는 그것을 볼 수있다. – Syspect

+0

simplexml_load_file을 사용하면 네임 스페이스를 지정할 수 있습니다. 아마도 그것은 이미 그것을 해결할 것입니다. 그렇지 않다면 XML을 네임 스페이스와 함께 업로드하여 링크를 찾아보십시오. 그리고 단지 FYI 1.와 2.) 꽤 유사합니다, 당신은 단지 1을 사용할 수 있습니다.) 귀하의 경우에는 둘 사이에 차이가 없습니다. – hakre

답변

0

코드를 테스트 한 결과 정상적으로 작동합니다.

Array ([0] => SimpleXMLElement Object ([@attributes] => Array ([Something] => blahblahblah))) 

2 개만 변경됩니다.

  1. 당신은 <Info Art"asda" Somethig="dsad"/> 당신이 XML이 작동하려면 등록을해야 <Info Art="asda" Somethig="dsad"/>

해야 당신은 등호 누락 <?xml version="1.0" encoding="UTF-8"?>

  • 수 있도록 XML의 첫 번째 라인을 nedd 네임 스페이스 접두사 :

    $xml->registerXPathNamespace("w", "http://something"); 
    

    여기에 더 많은 광고 : link

  • +0

    itslef 파일에서 - 나는 (당신이 말했듯이) 첫 번째 줄을 가지고 있습니다. 등호에 관해서 - 나는 그 글을 쓰고있는 중 지금 그것을 놓쳤다. 그렇지 않으면 나는 그 (것)들을 놓치지 않는다 ... : D – Syspect

    +0

    나는 정확하게 문제를 일으키는 원인을주의해서 나의 포스트를 새롭게했다. (추신 : 네임 스페이스에 대한 답을 편집하지 못했습니다 ...) – Syspect

    관련 문제