2013-04-26 4 views
3

PHP로 SVG 태그 내용을 얻고 싶습니다.PHP로 SVG 태그 내용을 얻는 방법

test.svg :

<?xml version="1.0" encoding="utf-8"?> 
<!-- comment --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="202.5px" height="226.084px" viewBox="0 0 202.5 226.084" enable-background="new 0 0 202.5 226.084" xml:space="preserve"> 
    <g> 
     <path d="M0,13.628c47.7940,13.628z"/> 
     <polygon points="108.48,207.874 145.506,196.948 145.506,204.536 108.48,214.854 "/> 
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    </g> 
    <g>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    </g> 
    <anythingElse>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    <anythingElse>  
</svg> 

PHP :

$svg = new SimpleXMLElement(file_get_contents('test.svg') ); 

$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg'); 
$svg->registerXPathNamespace('xlink', 'http://www.w3.org/1999/xlink'); 

지금, 나는이 문자열로 SVG 태그 콘텐츠를하고 싶습니다.

원하는 결과 (하드 코딩 예) :

$content = '<g> 
    <path d="M0,13.628c47.7940,13.628z"/> 
    <polygon points="108.48,207.874 145.506,196.948 145.506,204.536 108.48,214.854 "/> 
    <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
</g> 
    <g>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    </g> 
    <anythingElse>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    <anythingElse> '; 

// 편집 : g 태그에보고 싶지 않은

: '/ SVG : SVG/SVG : g'. svg 내부에는 g 태그가 있다는 보장이 없으므로. 하나 이상의 g 태그 또는 다른 태그가있을 수 있습니다.

시작 및 종료 svg 태그 사이에 모든 것을 가져오고 싶습니다.

+1

어떻게 이런 일이 중복? – user2015338

+0

"simplexml get children"을 찾아 코드 스 니펫, 자습서 등을 찾아야합니다. 다음 번에 프로그래밍 문제를 명확히 해 두십시오. 프로그래밍보다는 표현하는 데 더 많은 문제가있을 수 있습니다.PHP 채팅에 가입하십시오. – hakre

답변

4

을 (더 가능성 : XML에 접두어가 없기 때문에 xpath에 XML 네임 스페이스를 등록해야합니다 (a previous answer에 추가로 제공되는 예제 코드에서 복사하여 붙여 넣기). xpath에 XML 네임 스페이스를 등록해야합니다.

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="202.5px" height="226.084px" viewBox="0 0 202.5 226.084" enable-background="new 0 0 202.5 226.084" xml:space="preserve"> 

URI는 http://www.w3.org/2000/svg이며 접두어는 제공되지 않습니다. 네임 스페이스의 <svg> 루트 요소입니다. 지금까지 무엇을 어느

$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg'); 

:

따라서 당신은 접두사 (다른 이미 접두사 네임 스페이스가 이미 자동으로 등록한다)를 등록해야합니다.

지금과 태그 이름을 앞에, XPath 쿼리에 등록 된 접두사를 사용하려면

/svg:svg/svg:g[1] 

당신에게 그 SVG-네임 스페이스의 첫 번째 <g> 요소를 제공해야합니다. 이것이 아직도 더 설명/설명이 필요한 경우 알려주십시오.

online demo을 참조하십시오.

이 정확히 이전 질문에 대한 이유 윤곽으로도 :

+0

이것은 단지 예입니다. 나는 g 꼬리표에 원하지 않는다. 나는 svg 태그 안에있는 것을 얻고 싶다. 나는 $ svgBody = $ svg-> xpath ('// svg : svg')를 시도했다; 예를 들어, 아직도 돈이 안되는 이유를 이해하지 못한다. – user2015338

+0

그리고'$ svgBody-> asXML ('php : // output');은 평범한 출처에서 무엇을 출력 하는가? * 편집 : * [온라인 데모] (http://eval.in/17651)도 추가되었으므로 코드가 어떻게 작동 하는지를 볼 수 있습니다. – hakre

+0

치명적인 오류 : 객체가 아닌 객체에서 XML()이라는 멤버 함수를 호출하십시오. – user2015338

1

은 당신이 돈 G 코드 태그 onle 얻을 생각, t는 당신이 시도 할 수있는 공간이 필요합니다

$result = $svg->xpath('svg/g'); 
foreach ($result as $gtag) { 
    echo $gtag . "\n"; 
} 

그래도 난 그것을 테스트 할 수 없습니다 : 당신은 이미 잘 보았다