Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SOLVED] SimpleXML i <![CDATA[...
Forum PHP.pl > Forum > PHP > Object-oriented programming
h3xed
Witam,

Ma ktoś pomysł na odczytanie danych znajdujących się za tagiem CDATA z wykorzystaniem SimpleXML ?

Oto przykładowy xml (kwałek):

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <Message msgID="99999999999999" timeStamp="2012-04-06T12:12:23" version="01.00" >
  3. <Sender id="0" system="xxx" version="xxx">
  4. <App name="Xxx" version="" />
  5. </Sender>
  6. <Recipient id="xxx" system="xxx" />
  7. <Packet>
  8. <PacketInfo>
  9. <action>xx</action>
  10. <manifest>
  11. <Type>xx</Type>
  12. <Version>xxx</Version>
  13. </manifest>
  14. <Status>
  15. <code></code>
  16. <longDescription>xxx</longDescription>
  17. </Status>
  18. <Command>
  19. <Code></Code>
  20. </Command>
  21. </PacketInfo>
  22. <payload crc="xxx"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  23. <PositionOpening>
  24. <PositionRecordInfo validFrom="2012-06-04">
  25. <IdXSDPL versionPL="xxx"/>
  26. <IdValueXMLPL>xxx</IdValueXMLPL>
  27. </PositionRecordInfo>
  28. <PositionSupplier>
  29. <SupplierId>
  30. <IdValue>Xxx</IdValue>
  31. </SupplierId>
  32. </PositionSupplier>
  33. <PositionProfile>
  34. <ProfileId validFrom="2012-06-04" validTo="2012-07-03">
  35. <PositionIdUPPL>Xxx</PositionIdUPPL>
  36. <PositionNumberPL>xxx</PositionNumberPL>
  37. </ProfileId>
  38. <ProfileName>xxx</ProfileName>
  39. <Organization>
  40. <OrganizationName>xxx</OrganizationName>
  41. <OrganizationId>
  42. <IdValue>Xxx</IdValue>
  43. </OrganizationId>
  44. <IndustryCode>xxx</IndustryCode>
  45. <IndustryCodeX>x</IndustryCodeX>
  46. <ContactInfo>
  47. [...]
  48. </PositionOpening>]]></payload>
  49. </Packet>
  50. </Message>


Udało mi się rozwiązać problem. Nie jest może to sposób optymalny ale działa smile.gif

Mianowicie postanowiłem usunąć znaczniki CDATA z pliku XML.

  1. $content = file_get_contents($fileName);
  2.  
  3. $content = preg_replace('/\<!\[CDATA\[/', '', $content);
  4. $content = preg_replace('/\<\?xml version="1.0" encoding="UTF-8"\?\>/', '', $content);
  5. $content = preg_replace('/\]\]\>/', '', $content);
  6.  
  7. $xml = simplexml_load_string($content);
  8.  
  9. foreach($xml->Packet->payload->PositionOpening->PositionProfile as $pos) {
  10. // odwołanie do poszczególnych gałęzi
  11. }
darko
Jeśli jednak chciałbyś rozwiązać problem, zamiast go omijać, to można tak:
  1. $xml = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);
h3xed
Cytat(darko @ 20.06.2012, 14:43:29 ) *
Jeśli jednak chciałbyś rozwiązać problem, zamiast go omijać, to można tak:
  1. $xml = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);


Sposób który zaproponowałeś sprawdza się w przypadku gdy w tagach CDATA znajdują się jedynie wartości. Natomiast gdy w tagach zostało umieszczone całe drzewo przy parametrze LIBXML_NOCDATA tracisz dostęp do poszczególnych gałęzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.