2011-07-13 11 views
19

Jak mogę uzyskać wartości wewnątrz <! [CDATA [wartości]] > przy użyciu php DOM. To jest kilka kodu z mojego xml.Jak uzyskać wartości wewnątrz <! [CDATA [wartości]]> używając PHP DOM?

 <Destinations> 

     <Destination> 
      <![CDATA[Aghia Paraskevi, Skiatos, Greece]]]]>><![CDATA[ 
      <CountryCode>GR</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Amettla, Spain]]]]>><![CDATA[ 
      <CountryCode>ES</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Amoliani, Greece]]]]>><![CDATA[ 
      <CountryCode>GR</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Boblingen, Germany]]]]>><![CDATA[ 
      <CountryCode>DE</CountryCode> 
     </Destination> 

    </Destinations> 
+0

Starasz się czytać ani pisać ten XML? Tak czy inaczej, czy naprawdę potrzebujesz tych podwójnych sekcji CDATA, gdy są one publikowane? –

+0

Chcę odczytać wartości z CDATA. – Hearaman

Odpowiedz

31

Praca z PHP DOM jest dość prosta i jest bardzo podobna do DOMa Javascript.

Oto ważne klasy: klasa

  • DOMNode — Podstawą wszystkiego, co może być przesuwany wewnątrz dokumentu XML/HTML, w tym węzły tekstowe, komentarz węzłów i CDATA węzły
  • DOMElement — Klasa podstawowa dla tagów .
  • DOMDocument — Podstawowa klasa dokumentów. Zawiera metody ładowania/zapisywania XML, a także metody normalnego dokumentu DOM (patrz poniżej).

Istnieje kilka sposobów i właściwości odcinkowe:

  • DOMDocument->load() — po utworzeniu nowego DOMDocument używać tej metody na tym obiekcie załadować z pliku.
  • DOMDocument->getElementsByTagName() ta metoda zwraca listę węzłów wszystkich elementów w dokumencie o podanej nazwie znacznika. Następnie możesz iterować (foreach) na tej liście.
  • DOMNode->childNodes — Lista węzłów wszystkich dzieci węzła. (Pamiętaj, że sekcja CDATA jest węzłem!)
  • DOMNode->nodeType — Uzyskaj type węzła. Węzły CDATA mają typ XML_CDATA_SECTION_NODE, który jest stałą o wartości .
  • DOMNode->textContentuzyskać zawartość tekstową dowolnego węzła.

Uwaga: Twoje sekcje CDATA są zniekształcone.Nie wiem, dlaczego jest dodatkowa ]] w pierwszym, albo niezamkniętych sekcji CDATA na końcu linii, ale myślę, że powinno być po prostu:

<![CDATA[Aghia Paraskevi, Skiatos, Greece]]> 

Wyrażając to wszystko razem:

  1. Utwórz nowy obiekt dokumentu i załadować XML
  2. uzyskać wszystkie Destination elementy według nazwy znacznika i iteracyjne nad listy
  3. iteracyjne nad wszystkich węzłów potomnych każdy Destination elementem
  4. Sprawdź, czy typ węzła jest XML_CDATA_SECTION_NODE
  5. Jeśli tak jest, echotextContent z tego węzła.

Kod:

$doc = new DOMDocument(); 
$doc->load('test.xml'); 
$destinations = $doc->getElementsByTagName("Destination"); 
foreach ($destinations as $destination) { 
    foreach($destination->childNodes as $child) { 
     if ($child->nodeType == XML_CDATA_SECTION_NODE) { 
      echo $child->textContent . "<br/>"; 
     } 
    } 
} 

Wynik:

Agia Paraskevi, Skiatos, Grecja
Amettla, Hiszpania
Amoliani, Grecja
Boblingen, Niemcy

+0

Hearaman chce odczytać węzeł zawierający CDATA i nie tworzyć węzła z cdata. – JellyBelly

+0

@JellyBelly źle to zinterpretowałem. Poprawiłem moją odpowiedź. – Nicole

+0

dzięki naprawieniu Renesis! – JellyBelly

3

Korzystanie zastąpić CDATA przed parsowania elementu PHP DOM po tym można uzyskać innerXml lub InnerHTML:

str_replace(array('<\![CDATA[',']]>'), '', $xml); 
+0

należy wypełnić przykładowy kod przykładowy, aby pobrać innerXml lub innerHtml ... –

10

Użyj tego:

$parseFile = simplexml_load_file($myXML,'SimpleXMLElement', LIBXML_NOCDATA) 

i dalej:

foreach ($parseFile->yourNode as $node){ 
etc... 
} 
+0

Chociaż w cieniu powyższej odpowiedzi, ta jest naprawdę przydatna, szczególnie dla nas, którzy zaczęli rozwijać używając simplexml. Dzięki! – bbujisic

1

Używam następującego kodu. Jej nie tylko odczytać wszystkie dane XML z

<![CDATA[values]] > 

ale również przekonwertować obiekt XML do PHP tablicę asocjacyjną. Możemy więc zastosować pętlę do danych.

$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true); 

Mam nadzieję, że to zadziała.

2

Najlepszy i łatwy sposób

$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA); 
$xmlJson = json_encode($xml); 
$xmlArr = json_decode($xmlJson, 1); // Returns associative array 
+0

Perfect Ans. +1 –

Powiązane problemy