2009-10-16 15 views
31

Próbowałem użyć SimpleXML, ale nie wydaje się, jak XML, który wygląda tak:Biblioteka PHP do parsowania XML z dwukropkami w nazwach znaczników?

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

Więc co będzie obsługiwać bibliotekę znaczników, które wyglądają tak (mają dwukropka w nich)?

+1

Proszę opublikować odpowiedni fragment kodu. SimpleXML nie powinien mieć żadnych problemów z obszarami nazw. –

+0

Doświadczyłem tego samego problemu z 'SimpleXMLElement ($ data)' zwracającą wartość null, jeśli dane xml mają dwukropki w tagach. –

Odpowiedz

64

Powiedz, że masz jakieś xml w ten sposób.

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

Można dostępu 'em' tak: $xml->children('xhtml', true)->div->em;

jednak, jeśli chcesz, aby pole daty, to: $xml->children('xhtml', true)->div->date;przyzwyczajenie praca, bo utkniesz w przestrzeni nazw XHTML.

trzeba wykonać „dzieci” ponownie, aby wrócić do domyślnej przestrzeni nazw:

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

nie wiesz, dlaczego nie jest to wybrana odpowiedź. Ale dla każdego w przyszłości to jest ten, który rozwiązał moje pytania/problem! :) – daveomcd

7

Colon oznacza przestrzeń nazw XML. DOM ma dobre wsparcie dla przestrzeni nazw.

+0

SimpleXML prawdopodobnie też, ale OP szuka znacznika "xhtml: div" zamiast tylko "div". –

+0

SimpleXML ma * trochę * rzeczy do radzenia sobie z nim, ale nadal nie mogę go uruchomić poprawnie. – mpen

18

Jeśli chcesz naprawić je szybko zrobić (zrobić, gdy czuję się leniwy):

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

Spowoduje to konwersję <xhtml: na <xhtml_ i </xhtml: na </xhtml_. Trochę zepsuty i może się nie powieść, jeśli zaangażowane są bloki kontenerów NameSpaced XML lub nazwy znaczników UNICODE, ale powiedziałbym, że zazwyczaj bezpiecznie używasz tego (jeszcze mnie nie zawiodło).

+4

To jest brudne. Ale dobrze;) – joedevon

+0

Działa, ale jest trochę hacky .. wkręcił zawartość moich tagów '' i zmienił czas – supersan

2

Nie sądzę, że dobrym pomysłem jest pozbycie się jelita grubego lub zastąpienie go czymś innym, co sugerują niektóre osoby. Możesz łatwo uzyskać dostęp do elementów, które mają prefiks przestrzeni nazw. Można przekazać adres URL, który identyfikuje przestrzeń nazw jako argument metody children() lub przekazuje prefiks przestrzeni nazw i "true" do metody children(). Drugie podejście wymaga PHP 5.2 i wyższych.

SimpleXMLElement::children

+0

Czy nie jest to dokładnie to, co Nathan Reed zasugerował w odpowiedzi, którą przyjąłem? Zgadzam się, że regex-fu jest brudnym hackerem, ale przejście przez selektor 'children()' również nie jest zabawne. – mpen

+0

Tak, to samo. Chciałem tylko wskazać, że możesz przekazać adres URL identyfikujący przestrzeń nazw do metody children(), która działa z PHP 5 i nowszym. IMHO, nie ma potrzeby robienia brudnego hacka, kiedy jest dostępna metoda rdzeniowa. –

Powiązane problemy