आपका प्रश्न वास्तव में व्यापक है, सबसे अच्छा उत्तर मैं दे सकता हूं कि आपको अपना खुद का लिखने के बजाय एक्सएमएल को एन्कोड करने के लिए कुछ मौजूदा लाइब्रेरी का उपयोग करना चाहिए (जैसा कि आप स्पष्ट रूप से नौकरी में असफल होते हैं इसलिए एक्सएमएल उपभोक्ता द्वारा एक्सएमएल एन्कोडिंग त्रुटि की सूचना दी जाती है)।
मौजूदा पुस्तकालय का उपयोग करने से आप पहले की समस्याओं को इंगित कर सकेंगे। उदा. निम्नलिखित कोड के लिए सुनिश्चित करें कि आप अपने डेटाबेस से वापस प्राप्त सभी UTF-8 एन्कोडेड स्ट्रिंग हैं।
साथ ही अधिक आधुनिक डेटाबेस क्लाइंट क्लास का उपयोग करने से आपको कोड लिखने में बहुत मदद मिलेगी। यहां PDO
के साथ एक उदाहरण दिया गया है
और DOMDocument
:
### configuration values
$config = array(
'Database' => array(
'dsn' => 'mysql:dbname=test;host=localhost;charset=utf8',
'user' => 'testuser',
'pass' => 'test',
),
'table_name' => 'config',
'table_fields' => '*',
);
### implement database access
class Database extends PDO
{
public function __construct(array $config = null)
{
$config = $config ? : $GLOBALS['config'][__CLASS__];
parent::__construct($config['dsn'], $config['user'], $config['pass']);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
}
### setup the datasource ($rows)
$db = new Database();
$rows = $db->query("SELECT $config[table_fields] FROM $config[table_name]");
### setup the XML encoder ($doc)
$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadXML("<$config[table_name]s/>");
$doc->encoding = 'utf-8';
### fetch data from the datasource and encode the XML
foreach ($rows as $row) {
$child = $doc->createElement($config['table_name']);
$child = $doc->documentElement->appendChild($child);
foreach ($row as $key => $value) {
$child->appendChild($doc->createElement($key, $value));
}
}
### output XML
header("Content-Type:text/xml");
echo $doc->saveXML();
देखें कि DomDocument
डेटाबेस से लौटाए गए यूटीएफ -8 स्ट्रिंग्स को ठीक से एन्कोड करने के लिए यहां देखभाल कर रहा है। <![CDATA[...]]>
. की कोई आवश्यकता नहीं है (सामान्यतः) यहाँ अब और। जैसा कि आप कल्पना कर सकते हैं कि आपने वहां कुछ ऐसा डाल दिया है जो आपके एक्सएमएल एन्कोडिंग को तोड़ देता है।
इसके अलावा डेटाबेस इंटरैक्शन के लिए, आपका अधिकांश कोड या तो आवश्यक नहीं है, आप केवल पंक्तियों पर पुनरावृति कर सकते हैं, यदि कोई पंक्तियाँ नहीं हैं, तो कोई पुनरावृत्ति नहीं होगी। यह आमतौर पर Iterator
. के साथ सबसे अच्छा व्यक्त किया जाता है foreach
भाषा निर्माण संचालित हो सकता है जिस पर आधुनिक डेटाबेस इंटरफेस द्वारा प्रदान किया जाता है। तकनीकी रूप से आप $rows
. को बदल सकते हैं यहां कई अन्य चीजों के साथ, एक पुनरावर्तक की तरह जो एक के बाद एक कई तालिकाओं पर जाता है।
इसके अतिरिक्त अपवाद त्रुटि मोड का उपयोग करने से आप चेक करने और die
के लिए बच जाते हैं आपके पूरे कोडबेस पर।
एक अनुकरणीय आउटपुट है:
<?xml version="1.0" encoding="utf-8"?>
<configs>
<config>
<id>1</id>
<option>value for option with ID1</option>
</config>
<config>
<id>2</id>
<option>value for option with ID2</option>
</config>
...
</configs>
यदि आपको अभी भी सीडीएटीए तत्व बनाने की आवश्यकता है, तो यह समान रूप से काम करता है (मैं यहां केवल स्क्रिप्ट का एक हिस्सा दिखाता हूं, जिसमें केवल एक मामूली संशोधन होता है जिसमें बच्चे के मूल्य के बजाय सीडीएटीए अनुभाग शामिल होते हैं):
### fetch data from the datasource and encode the XML
foreach ($rows as $row) {
$child = $doc->createElement($config['table_name']);
$child = $doc->documentElement->appendChild($child);
foreach ($row as $key => $value) {
$child->appendChild($doc->createElement($key))
->appendChild($doc->createCDATASection($value))
;
}
}
यहाँ भी, DOMDocument
सीडीएटीए अनुभाग को ठीक से एन्कोड करने का ख्याल रखता है। शायद कुछ ऐसा जो आपने नहीं किया।
संभावित समस्याएं जो आप अभी भी चला सकते हैं वे तालिका या पंक्ति नामों के साथ हैं जो हैं अमान्य XML नाम
. लेकिन फिर DOMDocument
वास्तव में आपको बताएगा ताकि आप एक्सएमएल उत्पन्न करते समय न केवल बाद में एन्कोडिंग त्रुटि के साथ जान सकें।