إيقاف الذاتي إغلاق علامات SimpleXML من أجل PHP?

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

  •  06-07-2019
  •  | 
  •  

سؤال

أنا بناء مستند XML مع PHP SimpleXML امتداد وانا إضافة رمز إلى الملف:

$doc->addChild('myToken');

هذا يولد (ما أعرف) الذاتي إغلاق أو واحد الوسم:

<myToken/>

ومع ذلك ، فإن الشيخوخة شبكة الإنترنت خدمة أنا أتواصل مع التعثر في جميع أنحاء علامات ذاتية الإغلاق, لذا يجب أن يكون منفصل فتح و إغلاق الوسم:

<myToken></myToken>

السؤال هو: كيف أفعل هذا ، خارج من تشغيل XML الذي تم إنشاؤه من خلال preg_replace?

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

المحلول

من الوثائق في SimpleXMLElement->__construct و LibXML الثوابت المعرفة مسبقا, أنا أعتقد أن هذا يجب أن تعمل:

<?php
$sxe = new SimpleXMLElement($someData, LIBXML_NOEMPTYTAG);

// some processing here

$out = $sxe->asXML();
?>

نحاول أن نرى ما اذا كان يعمل.وإلا أخشى انه preg_replace-أرض.

نصائح أخرى

في هذه اللحظة, فمن غير الممكن تجنب الذاتي إغلاق الكلمات الدليلية مع LibXML.واحدة من الحلول المقترحة من قبل @Piskvor لا تعمل:

LIBXML_NOEMPTYTAG لا يعمل مع simplexml ، satellite هنا:

This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions.

حلا لذلك سيتم استخدام الجواب من هذا السؤال

إذا قمت بتعيين القيمة إلى شيء فارغ (أيnull, سلسلة فارغة) فإنه سيتم استخدام فتح/إغلاق الأقواس.

$tag = '<SomeTagName/>';

echo "Tag: '$tag'\n\n";

$x = new SimpleXMLElement($tag);
echo "Autoclosed: {$x->asXML()}\n";

$x = new SimpleXMLElement($tag);
$x[0] = null;
echo "Null: {$x->asXML()}\n";

$x = new SimpleXMLElement($tag);
$x[0] = '';
echo "Empty: {$x->asXML()}\n";

انظر على سبيل المثال: http://sandbox.onlinephpfunctions.com/code/10642a84dca5a50eba882a347f152fc480bc47b5

قد لا يكون أفضل حل ولكن حصلت نفس المشكلة و حلها باستخدام pre_replace إلى تغيير جميع الذاتي إغلاق علامات شكل كامل...

$xml_reader = new XMLReader;
$xml_reader->open($xml_file);

$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());

LIBXML_NOEMPTYTAG يعمل ولكن فقط إذا كنت تستخدم DOMDocument::save أو DOMDocument::saveXML

$dom = dom_import_simplexml(SimpleXMLElement)->ownerDocument;
$dom->formatOutput = true;
$dom->save($save_path, LIBXML_NOEMPTYTAG);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top