إيقاف الذاتي إغلاق علامات SimpleXML من أجل PHP?
سؤال
أنا بناء مستند 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);