إجبار SimpleXML كائن إلى سلسلة ، بغض النظر عن السياق

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

  •  03-07-2019
  •  | 
  •  

سؤال

دعونا نقول لدي بعض XML مثل هذا

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>

رمز أدناه لا ما أريد في أن المخرجات العنوان سلسلة

$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;

هنا مشكلتي.رمز أدناه لا علاج العنوان سلسلة في هذا السياق لذلك أنا في نهاية المطاف مع SimpleXML الكائن في صفيف بدلا من سلسلة.

$foo = array( $xml->channel->item->title );

لقد تم العمل حول هذا

$foo = array( sprintf("%s",$xml->channel->item->title) );

ولكن يبدو أن القبيح.

ما هي أفضل طريقة لإجبار SimpleXML كائن إلى سلسلة ، بغض النظر عن السياق ؟

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

المحلول

التلبيس على SimpleXMLObject إلى سلسلة:

$foo = array( (string) $xml->channel->item->title );

رمز أعلاه داخليا المكالمات __toString() على SimpleXMLObject.هذه الطريقة ليست متاحة للجمهور ، كما أنها تتعارض مع رسم مخطط SimpleXMLObject, ولكن لا يزال يمكن أن يحتج بها في الطريقة المذكورة أعلاه.

نصائح أخرى

يمكنك استخدام وظيفة PHP

strval();

هذه الدالة تقوم بإرجاع سلسلة قيم المعلمات التي تم تمريرها إلى ذلك.

هناك الأصلية SimpleXML طريقة SimpleXMLElement::asXML اعتمادا على المعلمة فإنه يكتب SimpleXMLElement إلى xml 1.0 ملف أو سلسلة:

$xml = new SimpleXMLElement($string);
$validfilename = '/temp/mylist.xml';
$xml->asXML($validfilename);    // to a file
echo $xml->asXML();             // to a string

آخر قبيح طريقة للقيام بذلك:

$foo = array( $xml->channel->item->title."" );

يعمل, ولكن انها ليست جميلة.

للحصول على بيانات XML إلى مجموعة php يمكنك القيام بذلك:

// this gets all the outer levels into an associative php array
$header = array();
foreach($xml->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($header);
echo "</pre>";

للحصول على الطفل الطفل ثم مجرد القيام بذلك:

$data = array();
foreach($xml->data->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($data);
echo "</pre>";

يمكنك تعظيم $xml-> من خلال كل مستوى حتى تحصل على ما تريد يمكنك أيضا وضع كافة العقد في مجموعة واحدة دون مستويات أو مجرد عن أي طريقة أخرى تريدها.

الجواب المقبول في الواقع بإرجاع صفيف يحتوي على سلسلة, وهي ليست بالضبط ما OP المطلوبة (سلسلة).للتوسع في هذا الجواب ، استخدام:

$foo = [ (string) $xml->channel->item->title ][0];

والتي ترجع عنصر واحد من مجموعة ، سلسلة.

محاولة strval($xml->قناة -- >البند->العنوان)

لست متأكدا إذا غيروا وضوح __toString() الطريقة منذ الجواب المقبول كتب ولكن في هذا الوقت كان يعمل بشكل جيد بالنسبة لي:

var_dump($xml->channel->item->title->__toString());

الإخراج:

string(15) "This is title 1"

هناك الأصلية SimpleXML طريقة SimpleXMLElement::asXML اعتمادا على المعلمة فإنه يكتب SimpleXMLElement إلى xml 1.0 الملف, نعم

$get_file= read file from path;
$itrate1=$get_file->node;
$html  = $itrate1->richcontent->html;


echo  $itrate1->richcontent->html->body->asXML();
 print_r((string) $itrate1->richcontent->html->body->asXML());

التالية هي الدالة التي سوف التلبيس كل واحد الطفل العناصر String:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION - CLEAN SIMPLE XML OBJECT
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function cleanSimpleXML($xmlObject = ''){

    // LOOP CHILDREN
    foreach ($xmlObject->children() as $child) {

        // IF CONTAINS MULTIPLE CHILDREN
        if(count($child->children()) > 1 ){

            // RECURSE
            $child = cleanSimpleXML($child);

        }else{

            // CAST
            $child = (string)$child;

        }

    }

    // RETURN CLEAN OBJECT
    return $xmlObject;

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