Zauważyłem, że w przypadku SimpleXMLElement
dokumentu zawierającego te znaczniki CDATA zawartość jest zawsze NULL
. Jak to naprawić?
Przepraszamy za spamowanie tutaj na temat XML. Od kilku godzin staram się, aby skrypt oparty na XML działał ...
<content><![CDATA[Hello, world!]]></content>
Próbowałem pierwszego trafienia w Google, jeśli szukasz „SimpleXMLElement cdata”, ale to nie zadziałało.
Odpowiedzi:
Prawdopodobnie nie uzyskujesz do niego dostępu poprawnie. Możesz wyprowadzić go bezpośrednio lub rzutować jako ciąg. (w tym przykładzie rzutowanie jest zbędne, ponieważ echo i tak robi to automatycznie)
Możesz mieć więcej szczęścia z
LIBXML_NOCDATA
:źródło
print_r
rzeczywistości nie uzyskujesz do niego dostępu poprawnie. Napisz kod, który faktycznie chcesz - prawdopodobnie z obsadąecho
lub z(string)
obsadą, a przekonasz się, że zawartość jest w porządku. Nie używaj LIBXML_NOCDATA, jest to nieistotne.<anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>
. Węzły CDATA i węzły tekstowe są różnych typów, a SimpleXML śledzi to, dzięki czemu można odzyskać wstawiony kod XML. Kiedy wciskasz obiekt SimpleXML do tablicy, wyrzuca on wiele informacji - węzły CDATA, komentarze, każdy element nie w bieżącej przestrzeni nazw (np.<someNSPrefix:someElement />
), pozycja elementu potomnego w tekście itp.LIBXML_NOCDATA
konwertuje węzły CDATA na węzły tekstowe, ale nie naprawia reszty.LIBXML_NOCDATA
Jest opcjonalny trzeci parametrsimplexml_load_file()
funkcji. To zwraca obiekt XML ze wszystkimi danymi CDATA przekonwertowanymi na łańcuchy.Napraw CDATA w SimpleXML
źródło
To załatwiło sprawę dla mnie:
źródło
To działa idealnie dla mnie.
źródło
Kiedy używać
LIBXML_NOCDATA
?Dodaję problem przy przekształcaniu XML do JSON.
Podczas uzyskiwania dostępu do obiektu SimpleXMLElement pobiera CDATA:
Ma sens,
LIBXML_NOCDATA
ponieważjson_encode
nie mam dostępu do SimpleXMLElement, aby wywołać funkcję rzucania ciągów, zgaduję, że jest to__toString()
odpowiednik.źródło