2009-10-16 3 views
31

Ich habe versucht, SimpleXML zu verwenden, aber es scheint nicht, XML zu mögen, die wie folgt aussieht:PHP-Bibliothek zum Parsen von XML mit einem Doppelpunkt in Tag-Namen?

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

Also, welche Bibliothek Tags verarbeiten, die so aussehen (ein Doppelpunkt in ihnen haben)?

+1

Bitte senden Sie den entsprechenden Code-Schnipsel. SimpleXML sollte keine Probleme mit Namespaces haben. –

+0

Ich habe auch das gleiche Problem mit 'SimpleXMLElement ($ data)' zurückgegeben Null, wenn die XML-Daten Doppelpunkte in den Tags hat. –

Antwort

64

Angenommen, Sie haben etwas xml so.

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

Sie können auf 'em' wie folgt aus: $xml->children('xhtml', true)->div->em;

jedoch, wenn Sie das Datumsfeld wollen, dieses: $xml->children('xhtml', true)->div->date;nicht funktionieren, weil man in der xhtml Namensraum stecken geblieben sind.

müssen Sie wieder ‚Kinder‘ ausführen, um die Standard-Namespace zurück zu bekommen:

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

nicht sicher, warum dies nicht die ausgewählte Antwort ist. Aber für irgendjemanden in der Zukunft ist das derjenige, der meine Fragen/Probleme gelöst hat! :) – daveomcd

7

Doppelpunkt bezeichnet einen XML-Namespace. Die hat gute Unterstützung für Namespaces.

+0

SimpleXML funktioniert wahrscheinlich auch, aber das OP sucht nach einem Tag "xhtml: div" statt nur "div". –

+0

SimpleXML hat * einige * Sachen, um damit umzugehen, aber ich kann es immer noch nicht richtig machen. – mpen

18

Wenn Sie es schnell beheben möchten dies tun (ich tun, wenn ich faul fühlen):

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

Dies konvertiert <xhtml: in <xhtml_ und </xhtml: in </xhtml_. Art von Hacky und kann fehlschlagen, wenn CDATA NameSpaced XML-Container-Blöcke beteiligt sind oder UNICODE-Tag-Namen, aber ich würde sagen, Sie sind in der Regel sicher mit ihm (hat mich noch nicht gescheitert).

+4

Das ist schmutzig. Aber gut;) – joedevon

+0

Funktioniert aber es ist ein bisschen hacky .. schraubte den Inhalt meiner '' Tags und veränderte Zeit – supersan

2

Ich denke nicht, dass es eine gute Idee ist, den Doppelpunkt loszuwerden oder durch etwas anderes zu ersetzen, wie einige Leute vorgeschlagen haben. Sie können einfach auf Elemente mit einem Namespacepräfix zugreifen. Sie können entweder die URL, die den Namespace identifiziert, als Argument an die children() -Methode übergeben oder das Namespacepräfix und "true" an die Methode children() übergeben. Der zweite Ansatz erfordert PHP 5.2 und höher.

SimpleXMLElement::children

+0

Ist das nicht genau das, was Nathan Reed in der Antwort vorgeschlagen habe ich akzeptiert? Ich stimme zu, dass Regex-Fu ein schmutziger Hack ist, aber es ist auch nicht so lustig, den 'children()' Selector zu durchlaufen. – mpen

+0

Ja, das Gleiche. Ich wollte nur angeben, dass Sie die URL, die den Namespace identifiziert, auch an die children() -Methode übergeben können, die mit PHP 5 und höher funktioniert. IMHO, es gibt keinen Grund, einen schmutzigen Hack zu machen, wenn es eine Kernmethode gibt. –