2009-10-16 2 views
31

나는 SimpleXML를 사용하려고 노력했지만, 다음과 같습니다 XML 좋아하는 것 같지 않습니다태그 이름에 콜론이있는 XML을 구문 분석하기위한 PHP 라이브러리?

<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div> 

그래서 라이브러리가 같이 태그를 처리하는이 (그들에 콜론을)를?

+1

관련 코드 스 니펫을 게시하십시오. SimpleXML은 네임 스페이스에 문제가 없어야합니다. –

+0

또한 XML 데이터에 태그에 콜론이 있으면'SimpleXMLElement ($ data) '와 동일한 문제가 발생했습니다. –

답변

64

이렇게하면 xml을 사용한다고 가정 해보십시오.

<xhtml:div> 
    <xhtml:em>italic</xhtml:em> 
    <date>2010-02-01 06:00</date> 
</xhtml:div> 

당신은 '을 그들'과 같이 액세스 할 수 있습니다 $xml->children('xhtml', true)->div->em;

그러나을, 당신은 날짜 필드를 원하는 경우,이 : $xml->children('xhtml', true)->div->date;실 거예요 작업을, 당신은 XHTML 네임 스페이스에 붙어 있기 때문이다.

다시 '아이들'이 다시 기본 네임 스페이스 얻기 위해 실행해야합니다 : 당신이 빨리 문제를 해결하려면

$xml->children('xhtml', true)->div->children()->date; 
+1

이것이 왜 선택한 대답이 아닌지 확실하지 않습니다. 하지만 미래의 누군가에게 이것은 내 질문/문제를 해결 한 것입니다! :) – daveomcd

7

콜론은 XML 네임 스페이스를 나타냅니다. DOM은 네임 스페이스를 잘 지원합니다.

+0

SimpleXML도 가능하지만 OP는 "div"대신 "xhtml : div"태그를 찾고 있습니다. –

+0

SimpleXML에는 * 처리 할 물건이 있지만 제대로 작동하지 않습니다. – mpen

18

(내가 게으른 느낄 때 내가 할) :

// Will replace : in tags and attributes names with _ allowing easy access 
$xml = preg_replace('~(</?|\s)([a-z0-9_]+):~is', '$1$2_', $xml); 

이것은 <xhtml:<xhtml_으로, </xhtml:</xhtml_으로 변환합니다. CDATA NameSpaced XML 컨테이너 블록이 포함되어 있거나 UNICODE 태그 이름이 있지만 일반적으로 안전하게 사용한다고 가정하면 해키의 종류가 실패 할 수 있습니다. (아직 실패하지 않았습니다).

+4

그건 더러운거야. 하지만 좋은;) – joedevon

+0

작동하지만 조금 해키 .. 내 ''태그의 내용을 망쳐 놓고 시간을 바꾼 – supersan

2

나는 콜론을 제거하거나 다른 사람들이 제안한 것처럼 다른 것으로 대체하는 것이 좋지 않다고 생각합니다. 네임 스페이스 접두어가있는 요소에 쉽게 액세스 할 수 있습니다. 네임 스페이스를 식별하는 URL을 인수로 사용하여 children() 메서드에 전달하거나 네임 스페이스 접두사와 "true"를 children() 메서드에 전달할 수 있습니다. 두 번째 접근법은 PHP 5.2 이상이 필요합니다.

SimpleXMLElement::children

+0

정확히 받아 들인 대답에서 네이선 리드가 제안한 바가 아닙니까? 나는 regex-fu가 더러운 해킹이지만,'children()'선택자를 거치지 않아도된다는 것에 동의하지 않는다. – mpen

+0

네, 동일합니다. 방금 네임 스페이스를 식별하는 URL을 PHP 5 이상에서 작동하는 children() 메서드에 전달할 수도 있음을 나타냅니다. IMHO, 사용할 수있는 핵심 방법이있을 때, 더러운 해킹을 할 필요가 없습니다. –

관련 문제