Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SOLVED] SimpleXML i <![CDATA[...
h3xed
post 20.06.2012, 13:07:29
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 7
Dołączył: 30.01.2012

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował h3xed 20.06.2012, 13:08:22
Go to the top of the page
+Quote Post
darko
post 20.06.2012, 13:43:29
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Jeśli jednak chciałbyś rozwiązać problem, zamiast go omijać, to można tak:
  1. $xml = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
h3xed
post 20.06.2012, 14:16:32
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 7
Dołączył: 30.01.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 12:32