استرداد محتويات CDATA من XML باستخدام PHP وsimplexml

StackOverflow https://stackoverflow.com/questions/120016

  •  02-07-2019
  •  | 
  •  

سؤال

لدي بنية XML التالية:

<?xml version="1.0" ?>
<course xml:lang="nl">
  <body>
    <item id="787900813228567" view="12000" title="0x|Beschrijving" engtitle="0x|Description"><![CDATA[Dit college leert studenten hoe ze een onderzoek kunn$
    <item id="5453116633894965" view="12000" title="0x|Onderwijsvorm" engtitle="0x|Method of instruction"><![CDATA[instructiecollege]]></item>
    <item id="7433550075448316" view="12000" title="0x|Toetsing" engtitle="0x|Examination"><![CDATA[Opdrachten/werkstuk]]></item>
    <item id="015071401858970545" view="12000" title="0x|Literatuur" engtitle="0x|Required reading"><![CDATA[Wayne C. Booth, Gregory G. Colomb, Joseph M. Wi$
    <item id="5960589172957031" view="12000" title="0x|Uitbreiding" engtitle="0x|Expansion"><![CDATA[]]></item>
    <item id="3610066867901779" view="12000" title="0x|Aansluiting" engtitle="0x|Place in study program"><![CDATA[]]></item>
    <item id="19232369892482925" view="12000" title="0x|Toegangseisen" engtitle="0x|Course requirements"><![CDATA[]]></item>
    <item id="3332396346891524" view="12000" title="0x|Doelgroep" engtitle="0x|Target audience"><![CDATA[]]></item>
    <item id="6606851872934866" view="12000" title="0x|Aanmelden bij" engtitle="0x|Enrollment at"><![CDATA[]]></item>
    <item id="1478643580820973" view="12000" title="0x|Informatie bij" engtitle="0x|Information at"><![CDATA[Docent]]></item>
    <item id="9710608434763993" view="12000" title="0x|Rooster" engtitle="0x|Schedule"><![CDATA[1e semester, maandag 15.00-17.00, zaal 1175/030]]></item>
  </body>
</course>

أريد الحصول على البيانات من إحدى علامات العناصر.للوصول إلى هذه العلامة، أستخدم xpath التالي:

$description = $xml->xpath("//item[@title='0x|Beschrijving']");

يؤدي هذا بالفعل إلى إرجاع مصفوفة على شكل:

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 787900813228567
                    [view] => 12000
                    [title] => 0x|Beschrijving
                    [engtitle] => 0x|Description
                )
        )
)

ولكن أين توجد المعلومات الفعلية (المخزنة بين علامات العناصر)؟لا بد أنني أفعل شيئًا خاطئًا، لكن لا يمكنني معرفة ما قد يكون ذلك...ربما شيء بسيط حقا..سيكون موضع تقدير المساعدة.

هل كانت مفيدة؟

المحلول

عندما تقوم بتحميل ملف XML، ستحتاج إلى التعامل مع CDATA..يعمل هذا المثال:

<?php
$xml = simplexml_load_file('file.xml', NULL, LIBXML_NOCDATA);
$description = $xml->xpath("//item[@title='0x|Beschrijving']");
var_dump($description);
?>

وهنا الإخراج:

array(1) {
  [0]=>
  object(SimpleXMLElement)#2 (2) {
    ["@attributes"]=>
    array(4) {
      ["id"]=>
      string(15) "787900813228567"
      ["view"]=>
      string(5) "12000"
      ["title"]=>
      string(15) "0x|Beschrijving"
      ["engtitle"]=>
      string(14) "0x|Description"
    }
    [0]=>
    string(41) "Dit college leert studenten hoe ze een on"
  }
}

نصائح أخرى

أعتقد أنها تعادل طريقة __toString() على الكائن، لذلك

echo $description[0];

يجب أن تعرضه، أو يمكنك إلقاءه؛

$str = (string) $description[0];

ألق نظرة على وثائق PHP.net الخاصة بـ "SimpleXMLElement" (http://uk.php.net/manual/en/function.simplexml-element-children.php) يبدو أن تحويل العقدة إلى سلسلة "(سلسلة) $ ؛" عمل الحيلة.

إذا تعذر ذلك، فهناك الكثير من الأمثلة في تلك الصفحة والتي يجب أن توجهك في الاتجاه الصحيح!

$description = $xml->xpath("//item[@title='0x|Beschrijving']");

while(list( , $node) = each($description)) {

echo($node);

}

حل Dreamwerx هو الأفضل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top