2009-10-16 23 views
31

Ho cercato di usare SimpleXML, ma non sembra come XML che assomiglia a questo:Libreria PHP per l'analisi di XML con i due punti nei nomi dei tag?

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

Così che cosa biblioteca gestirà i tag che assomigliano a che (hanno due punti in loro)?

+1

Si prega di inserire il frammento di codice corrispondente. SimpleXML non dovrebbe avere problemi con i namespace. –

+0

Ho anche riscontrato lo stesso problema con 'SimpleXMLElement ($ data)' restituendo null se i dati xml hanno due punti nei tag. –

risposta

64

Supponiamo di avere qualche xml come questo.

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

È possibile accedere 'em' in questo modo: $xml->children('xhtml', true)->div->em;

tuttavia, se si desidera che il campo della data, questo: $xml->children('xhtml', true)->div->date;wont lavoro, perché si sono bloccati nello spazio dei nomi XHTML.

è necessario eseguire 'figli' di nuovo per tornare allo spazio dei nomi di default:

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

non sono sicuro del motivo per cui questa non è la risposta selezionata. Ma per chiunque in futuro questo è quello che ha risolto le mie domande/problemi! :) – daveomcd

7

Colon indica uno spazio dei nomi XML. Il DOM ha un buon supporto per gli spazi dei nomi.

+0

Probabilmente lo fa anche SimpleXML, ma l'OP sta cercando un tag "xhtml: div" invece di solo "div". –

+0

SimpleXML ha * alcune * cose per gestirlo, ma non riesco ancora a farlo funzionare correttamente. – mpen

18

Se si vuole risolvere il problema in modo rapido fare questo (io lo faccio quando mi sento pigro):

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

Questo convertirà <xhtml: in <xhtml_ e </xhtml: in </xhtml_. Tipo di hacky e può fallire se sono coinvolti blocchi di container XML NameSpaced CDATA o nomi di tag UNICODE, ma direi che di solito si sta utilizzando senza problemi (non mi ha ancora fallito).

+4

È sporco. Ma bello;) – joedevon

+0

Funziona ma è un po 'hacky .. ha rovinato il contenuto dei miei tag '' e ha cambiato il tempo – supersan

2

Non penso che sia una buona idea eliminare il colon o sostituirlo con qualcos'altro come qualcuno ha suggerito. Puoi facilmente accedere agli elementi che hanno un prefisso di namespace. È possibile passare l'URL che identifica lo spazio dei nomi come argomento del metodo children() o passare il prefisso dello spazio dei nomi e "true" al metodo children(). Il secondo approccio richiede PHP 5.2 e versioni successive.

SimpleXMLElement::children

+0

Non è esattamente questo che ha suggerito Nathan Reed nella risposta che ho accettato? Sono d'accordo sul fatto che regex-fu sia un trucco sporco, ma non è neanche divertente dover passare attraverso il selettore 'children()'. – mpen

+0

Sì, lo stesso. Volevo solo indicare che puoi anche passare l'URL che identifica lo spazio dei nomi al metodo children() che funziona con PHP 5 e versioni successive. IMHO, non c'è bisogno di fare un trucco sporco, quando c'è un metodo di base disponibile. –

Problemi correlati