ساخت فایل xml با پی اچ پی
فایلهای xml همانطور که میدانید بیشتر کاربردهای برای خروجی گرفتن از اطلاعات سایت یا کاربرد محبوب آنها در sitemapها است. در این نوشته با شما روش ساخت فایلهای xml را در زبان برنامه نویسی php آموزش میدهیم تا بتوانید به سادگی از آن استفاده کنید. این آموزش کاملا به صورت اختصاصی نوشته شده است پس برای حمایت از ما آن را با دوستان خود به اشتراک بگذارید.
ساخت فایل xml با پی اچ پی
اگر علاقه دارید در ارتباط با این آموزش تخصصیتر بخوانید روی این لینک کلیک کنید. خب برای ساخت فایلهای xml در php ما ابتدا یک کلاس به نام xmlwriter در نظر گرفتهایم.
کلاس xml writer
<?php
class Xml_writer extends XMLWriter
{
private $_rootName = '';
private $_xmlVersion = '1.0';
private $_charSet = 'UTF-8';
private $_indentString = ' ';
private $_xsltFilePath = '';
public function __construct ()
{}
public function setRootName ($rootName)
{
$this->_rootName = $rootName;
}
public function setXmlVersion ($version)
{
$this->_xmlVersion = $version;
}
public function setCharSet ($charSet)
{
$this->_charSet = $charSet;
}
public function setIndentStr ($indentString)
{
$this->_indentString = $indentString;
}
public function setXsltFilePath ($xsltFilePath)
{
$this->_xsltFilePath = $xsltFilePath;
}
public function initiate ()
{
$this->openMemory();
if ($this->_indentString) {
$this->setIndent(true);
$this->setIndentString($this->_indentString);
}
$this->startDocument($this->_xmlVersion, $this->_charSet);
if ($this->_xsltFilePath) {
$this->writePi('xml-stylesheet', 'type="text/xsl" href="' . $this->_xsltFilePath . '"');
}
$this->startElement($this->_rootName);
}
public function startBranch ($name, $attributes = array())
{
$this->startElement($name);
$this->_addAttributes($attributes);
}
public function endBranch ()
{
$this->endElement();
}
public function addNode ($name, $value, $attributes = array(), $cdata = false)
{
if ($cdata) {
$this->startElement($name);
$this->_addAttributes($attributes);
$this->writeCdata($value);
$this->endElement();
}
else {
$this->startElement($name);
$this->_addAttributes($attributes);
$this->text($value);
$this->endElement();
}
}
public function getXml ($echo = false)
{
if ($echo == true) {
header('Content-type: text/xml');
}
$this->endElement();
$this->endDocument();
$output = $this->outputMemory();
if ($echo == true) {
print $output;
}
return $output;
}
private function _addAttributes ($attributes)
{
if (count($attributes) > 0) {
foreach ($attributes as $key => $value) {
$this->writeAttribute($key, $value);
}
}
}
}
?>
توضیحات کلاس xml writer:
- این کلاس شامل پنج متغیر به صورت private است این متغیرها شامل نامهای زیر است:
- _rootName.
- _xmlVersion.
- _charSet.
- _indentString.
- _xsltFilePat.
- کلاس بالا شامل توابع زیر است: (توابع زیر همگی public هستند.)
- __construct.
- setRootName.
- setXmlVersion.
- setCharSet.
- setIndentStr.
- setXsltFilePath.
- initiate.
- startBranch.
- addNode.
- getXml.
- _addAttributes.
خب کلاس بالا را با نام xmlwriter.php در کنار پروژهی خود ذخیره کنید و به سادگی از حالا یک کلاس برای ساخت فایلهای xml دارید.
نحوه استفاده از xmlwriter در php
برای استفاده از کلاس xml writer کافی است مثال زیر را توجه کنید:
<?php
require_once("xmlWriter.php");
$xml = new Xml_writer;
$xml->setRootName('Student');
$xml->initiate();
$xml->startBranch("person");
$xml->addNode("firstName", "Amir");
$xml->addNode("lastName", "Shokri");
$xml->endBranch();
$xml->startBranch("person");
$xml->addNode("firstName", "John");
$xml->addNode("lastName", "Due");
$xml->endBranch();
$file_name = "myxmlfile.xml";
$myxmlfile = fopen($file_name, "w");
fwrite($myxmlfile, $xml->getXml(false));
fclose($myxmlfile);
?>
در مثال بالا ابتدا کلاس xml writer را با تابع require_once فراخوانی کردیم. بعد از فراخوانی این کلاس یک نمونه از آن ساختهایم و نام آن را $xml قرار دادهایم. (در پی اچ پی نام متغیرها با علامت $ شروع میشود.) سپس با تابع setRootName یک Root برای فایل xml تعیین کردیم که تمام اعضا از این به بعد در ساختار این ریشه قرار بگیرند. (فایلهای xml میتوانند چند ریشهای شوند.) سپس با توابع startBranch و addNode میتوانید آیتمهای جدید را به آن اضافه کنید. در آخر هم با توابع نوشتن در فایل یک فایل xml ایجاد کردهایم و محتوای ایجاد شده را با تابع getXml درون آن قرار دادیم.
شما همچنین میتوانید در این لینک با نحوهی ساخت فایل اکسل یا csv در پی اچ پی آشنا شوید.
اگر روشهای بهتری برای ساخت فایل xml با php میشناسید در بخش نظرات برای ما بنویسید. منتظر نظرات و پیشنهادات و سوالات شما در ارتباط با این آموزش کاربردی و ساده هستیم؛ نظرهای شما باعث دلگرمی ما میشود.



















خروجی روی هاستهای با mbstring.func_overload مشکل نمیخورد؟
خیر، با این کلاس معمولاً مشکلی پیش نمیآد. mbstring.func_overload بیشتر روی توابع رشتهای استاندارد مثل strlen/strpos اثر میذاره. اینجا از XMLWriter استفاده شده که خودش متن رو درست به UTF-8 مینویسه. فقط دقت کن اگه جایی طول محتوا محاسبه میکنی (مثلاً برای Content-Length) از نسخهٔ چندبایتی (mb_strlen($str, ‘8bit’)) یا کلاً بدونِ تعیین طول استفاده کنی. در ضمن این گزینه از PHP 8 به بعد حذف شده، پس روی نسخههای جدید هم نگرانی نداری.
برای سایتمپ، چطور میشود lastmod و priority را بهصورت attribute اضافه کرد؟
در استاندارد XML Sitemap، فیلدهای lastmod و priority باید عنصر (element) باشن، نه attribute.
اگر مقدار نود حاوی کاراکترهای کنترل یا باینری باشد، بهتر است همیشه CDATA بگذاریم؟
نه، CDATA جلوی کاراکترهای غیرمجاز (کنترلهای ممنوع در XML 1.0) رو نمیگیره. CDATA فقط از escape کردن < و & خلاصت میکنه.
برای مدیریت namespace ها توی XML چه روشی پیشنهاد میدهید؟
برای namespaceها از متدهای namespaced خود XMLWriter استفاده کن.
این کلاس با فایلهای خیلی بزرگ هم جواب میدهد یا باید به سمت استریمنویسی برویم؟
این کلاس الان از openMemory() استفاده میکنه و کل خروجی تو RAM جمع میشه.