2008-09-19 26 views
16

से PHP एसोसिएटिव सरणी पास करना क्या एक्सएमएल से PHP से एसोसिएटिव सरणी को मार्शल करने का कोई आसान तरीका है?एक्सएमएल

$items = array("1", "2", 
    array(
     "item3.1" => "3.1", 
     "item3.2" => "3.2" 
     "isawesome" => true 
    ) 
); 

मैं कैसे संभव के रूप में है, तो फिर से वापस के रूप में कुछ पंक्तियों में निम्न XML करने के लिए कुछ इसी तरह में बदल जाएगा: उदाहरण के लिए, मैं निम्नलिखित सरणी है?

<items> 
    <item>1</item> 
    <item>2</item> 
    <item> 
     <item3_1>3.1</item3_1> 
     <item3_2>3.2</item3_2> 
     <isawesome>true</isawesome> 
    </item> 
</items> 

मैं वास्तव में परवाह नहीं है मैं सरणी संरचना थोड़ा या यदि एक्सएमएल कि बाहर आता है ऊपर के उदाहरण के लिए अलग है परिवर्तित करने के लिए किया है। मैं PHP के XMLReader और XMLWriter के साथ काम करने की कोशिश कर गया है, लेकिन प्रलेखन इतना गरीब है और कोड मैं एक परिणाम के रूप में निर्मित किया गया है कि मैं क्या लगता है कि यह देखना चाहिए की तरह कुछ भी दिखता है:

$xml = SomeXMLWriter::writeArrayToXml($items); 
$array = SomeXMLWriter::writeXmlToArray($xml); 

यह वास्तव में करता है अपनी खुद की कस्टम कक्षा लिखने के बिना एक PHP सरणी का मूल, कच्चा एक्सएमएल डंप प्राप्त करने के लिए उससे कहीं अधिक कठिन होना चाहिए?

मैं पियर से बचने की कोशिश करता हूं। कॉन्फ़िगरेशन सिरदर्द के अलावा, मैंने इसके साथ कभी भी उपयोग नहीं किया है, मैंने कभी भी किसी भी पैकेज के साथ अटक नहीं लिया है जिसे मैंने कभी भी उपयोग किया है।

उत्तर

6

आप नाशपाती संकुल का उपयोग नहीं कर के उन लोगों के लिए है, लेकिन आप कर ली PHP5 स्थापित किया है। यह मेरे लिए काम किया:

/** 
* Build A XML Data Set 
* 
* @param array $data Associative Array containing values to be parsed into an XML Data Set(s) 
* @param string $startElement Root Opening Tag, default fx_request 
* @param string $xml_version XML Version, default 1.0 
* @param string $xml_encoding XML Encoding, default UTF-8 
* @return string XML String containig values 
* @return mixed Boolean false on failure, string XML result on success 
*/ 
public function buildXMLData($data, $startElement = 'fx_request', $xml_version = '1.0', $xml_encoding = 'UTF-8') { 
    if(!is_array($data)) { 
     $err = 'Invalid variable type supplied, expected array not found on line '.__LINE__." in Class: ".__CLASS__." Method: ".__METHOD__; 
     trigger_error($err); 
     if($this->_debug) echo $err; 
     return false; //return false error occurred 
    } 
    $xml = new XmlWriter(); 
    $xml->openMemory(); 
    $xml->startDocument($xml_version, $xml_encoding); 
    $xml->startElement($startElement); 

    /** 
    * Write XML as per Associative Array 
    * @param object $xml XMLWriter Object 
    * @param array $data Associative Data Array 
    */ 
    function write(XMLWriter $xml, $data) { 
     foreach($data as $key => $value) { 
      if(is_array($value)) { 
       $xml->startElement($key); 
       write($xml, $value); 
       $xml->endElement(); 
       continue; 
      } 
      $xml->writeElement($key, $value); 
     } 
    } 
    write($xml, $data); 

    $xml->endElement();//write end element 
    //Return the XML results 
    return $xml->outputMemory(true); 
} 
+3

आप गैर साहचर्य सरणियों (या बल्कि, उन में संख्या के साथ सरणी कुंजी) आपके डेटा में, एक जोड़ने अगर 'अगर (is_numeric ($ कुंजी)) $ key = "आइटम",' foreach ब्लॉक (is_array से पहले) की शुरुआत में चाल है। – Kemal

+1

संख्यात्मक सरणी के साथ कार्यात्मक होने के लिए, '$ fKey = is_numeric ($ key) जोड़ें? 'numericValue': $ key; '** ** ** ** (if_array ($ value)) 'कथन, और शेष foreach कथन में' $ fKey' का उपयोग करें। – Vassilis

+1

ओह @ वासिलिस जीआर, मैंने वहां कुछ ऐसा किया: 'अगर (is_numeric ($ key)) {$ key =' node '; } 'और 'फ़ंक्शन लिखें' को बाहर ले जाया गया है, आप एक ही फ़ंक्शन को दो बार घोषित नहीं कर सकते हैं, लेकिन @ कोनराड अब वह करेगा। (ओह, मैं अब देखा टिप्पणी @disq haha) – Wiliam

2

सामान्य रूप से Zend_Config और Zend Framework आज़माएं।

मुझे लगता है कि यह एक 2 कदम प्रक्रिया होगी: Zend_Config के लिए सरणी, Zend_Config XML पर।

2

SimpleXML के लिए नौकरी की तरह लगता है।

.. मैं एक अलग XML संरचना सुझाव है

और क्यों आप एक सरणी से बदलने की आवश्यकता -> एक्सएमएल और वापस .. के रूप में आप ने कहा कि यही कारण है कि न सिर्फ एक्सएमएल उत्पन्न आप सरणी संरचना को संशोधित कर सकते हैं बजाय? अगर कोड का कुछ टुकड़ा पहले से मौजूद है जो उस सरणी कॉन्फ़िगरेशन को लेता है, तो इसे इसके बजाय एक्सएमएल स्वीकार करने के लिए संशोधित करें। तो फिर तुम 1 डेटा स्वरूप/इनपुट प्रकार है, और सब पर बदलने की आवश्यकता नहीं है ..

<items> 
    <item id="1"/> 
    <item id="2"/> 
    <item id="3"> 
    <subitems>  
    <item id="3.1"/> 
    <item id="3.2" isawesome="true"/> 
    </subitems> 
    </item> 
</items> 
1

मैं मानता हूँ यह एक ऐसा क्षेत्र है कि PHP के दस्तावेज़ गेंद को गिरा दिया गया है, लेकिन मेरे लिए मैं हमेशा उपयोग किया है SimpleXML xml2Array फ़ंक्शंस जैसे कुछ के साथ मिश्रित है। सरल एक्सएमएल से प्राप्त एक्सएमएल प्रिंट_आर जैसे डंपिंग फ़ंक्शन की मदद से नेविगेट करना मुश्किल नहीं है।

3

मैं ये वही मुद्दों में से कुछ मिला है, और इसलिए मैं दो वर्गों बनाया:

bXml

एक वर्ग है कि SimpleXML प्रदान करता है और समस्याओं यह है में से कुछ को सही। सीडीएटा नोड्स या टिप्पणी नोड्स जोड़ने में सक्षम नहीं है। मैंने कुछ अतिरिक्त विशेषताओं को भी जोड़ा, जैसे कि बच्चे नोड्स $oXml->AddChild("file:///user/data.xml") जोड़ने के लिए PHP स्ट्रीम कार्यक्षमता का उपयोग करना या $oXml->AddChild("<more><xml>yes</xml></more>"); जैसे एक्सएमएल स्ट्रिंग बाल नोड्स जोड़ें लेकिन मूल रूप से मैं बस सरलXML समस्याओं को ठीक करना चाहता था।

bArray

मैं ArrayObject वर्ग ताकि सभी सरणी कार्यक्षमता वस्तु उन्मुख किया जा सकता है और लगातार बढ़ाया है, तो आप, जबकि array_filter पर चल रही है कि array_walk संदर्भ द्वारा सरणी पर चल रही है याद करने के लिए की जरूरत नहीं है मूल्य से सरणी। तो आप $oArray->flip()->Reverse()->Walk(/*callback*/); जैसी चीजें कर सकते हैं फिर भी उस मान को तब तक एक्सेस करें जैसे आप आमतौर पर $oArray[key] पसंद करेंगे।

दोनों विधियां खुद को Arrays और Xml के रूप में आउटपुट करती हैं ताकि आप उनके बीच सहजता से कूद सकें। तो आप $oXml->AsArray(); या $oArray->AsXml(); देख सकते हैं कि मैंने पाया कि यह सरणी 2xml या xml2array विधियों के बीच लगातार आगे की चीजों को आगे बढ़ाने के लिए करना आसान था।

http://code.google.com/p/blibrary/source

दोनों वर्गों अपने द्वारा चयनित किसी कस्टम वर्ग बनाने के लिए अधिरोहित जा सकता है कर रहे हैं और एक दूसरे से स्वतंत्र किया जा सकता है।

+0

ऐसा करने के लिए SimpleXML का विस्तार करना एक सुंदर साफ विचार है! – thomasrutter

0

निम्नलिखित कक्षा सरल प्राप्त करने के लिए सरल एक्सएमएल का उपयोग करती है, तो आपको केवल सरणी के माध्यम से लूप करने और ximplexml के एन्चिल्ड को कॉल करने की आवश्यकता होती है।

http://snipplr.com/view.php?codeview&id=3491

2

यहाँ एक समारोह है कि मैं एक्सएमएल लेने के लिए लिखा था और एक PHP साहचर्य सरणी में बदल देता है। एक चेतावनी यह है कि आईडी वर्तमान में विशेषताओं या सी-डेटा को संभाल नहीं पाती है। हालांकि यह टैग के नाम पर एक सरणी में रख कर उसी स्तर पर बार-बार एक्सएमएल टैग को संभालेगा।


<?php 

$xml_req1 = <<<XML 
<?xml version="1.0"?> 
<Vastera:CustomerValidation_RequestInfo 
     xmlns:Vastera="http://ndc-ah-prd.am.mot.com:10653/MotVastera_CustomerValidation/MC000078/Docs/"> 
    <PartnerID>5550000100-003</PartnerID> 
    <PartnerType>PTNR_INTER_CONSIGNEE</PartnerType> 
    <OperatingUnit>100</OperatingUnit> 
    <Status>ACTIVE</Status> 
    <CustomerSeqNumber>111</CustomerSeqNumber> 
    <CustomerName>Greg Co</CustomerName> 
    <Address1>123 Any Ln</Address1> 
    <Address2>?</Address2> 
    <Address3>?</Address3> 
    <Address4>?</Address4> 
    <Address5>?</Address5> 
    <City>Someplace</City> 
    <PostalCode>603021</PostalCode> 
    <State>CA</State> 
    <CountryCode>US</CountryCode> 
    <TaxReference>222</TaxReference> 
    <PartyRelated>Y</PartyRelated> 
    <BusinessUnit>GSBU</BusinessUnit> 
    <Region>GSRGN</Region> 
    <LocationName>DBA Mac Head Computing</LocationName> 
    <LoadOnly>N</LoadOnly> 
    <VSTM>333</VSTM> 
    <MilitaryCustomerFlag>Y</MilitaryCustomerFlag> 
    <USFederalGovernmentCustomer>Y</USFederalGovernmentCustomer> 
    <Non-USGovernmentCustomer>Y</Non-USGovernmentCustomer> 
    <Vastera:EPCIActivity> 
    <EPCIActivityNuclearCode>NUCLEAR</EPCIActivityNuclearCode> 
    <EPCIActivityNuclearValue>N</EPCIActivityNuclearValue> 
    <EPCIActivityNuclearApproveDate>2011-05-16:07:19:37</EPCIActivityNuclearApproveDate> 
    <EPCIActivityNuclearExpireDate>2056-12-31:12:00:00</EPCIActivityNuclearExpireDate> 
    <EPCIActivityNuclearCountry>US</EPCIActivityNuclearCountry> 
    <EPCIActivityChemBioCode>CHEM_BIO</EPCIActivityChemBioCode> 
    <EPCIActivityChemBioValue>N</EPCIActivityChemBioValue> 
    <EPCIActivityChemBioApproveDate>2011-05-16:07:19:37</EPCIActivityChemBioApproveDate> 
    <EPCIActivityChemBioExpireDate>2056-12-31:12:00:00</EPCIActivityChemBioExpireDate> 
    <EPCIActivityChemBioCountry>US</EPCIActivityChemBioCountry> 
    <EPCIActivityMissileCode>MISSILE</EPCIActivityMissileCode> 
    <EPCIActivityMissileValue>N</EPCIActivityMissileValue> 
    <EPCIActivityMissileApproveDate>2011-05-16:07:19:37</EPCIActivityMissileApproveDate> 
    <EPCIActivityMissileExpireDate>2056-12-31:12:00:00</EPCIActivityMissileExpireDate> 
    <EPCIActivityMissileCountry>US</EPCIActivityMissileCountry> 
    </Vastera:EPCIActivity> 
    <SourceSystem>GSB2BSS</SourceSystem> 
    <CreatedDate>2011-05-16:07:18:55</CreatedDate> 
    <CreatedBy>c18530</CreatedBy> 
    <LastModifiedDate>2011-05-16:07:18:55</LastModifiedDate> 
    <LastModifiedBy>c18530</LastModifiedBy> 
    <ContactName>Greg, "Da Man" Skluacek</ContactName> 
    <ContactTitle>Head Honcho</ContactTitle> 
    <ContactPhone>555-555-5555</ContactPhone> 
    <ContactFax>666-666-6666</ContactFax> 
    <ContactEmail>[email protected]</ContactEmail> 
    <ContactWeb>www.gregco.com</ContactWeb> 
</Vastera:CustomerValidation_RequestInfo> 
XML; 

$xml_req2 = <<<XML 
<?xml version="1.0"?> 
<order> 
    <orderNumber>123</orderNumber> 
    <customerAddress> 
     <type>Ship To</type> 
     <name>Bob McFly</name> 
     <addr1>123 Lincoln St</addr1> 
     <city>Chicago</city> 
     <state>IL</state> 
     <zip>60001</zip> 
    </customerAddress> 
    <customerAddress> 
     <type>Bill To</type> 
     <name>McFly Products Inc.</name> 
     <addr1>P.O. Box 6695</addr1> 
     <city>New York</city> 
     <state>NY</state> 
     <zip>99081-6695</zip> 
    </customerAddress> 
    <item> 
     <line>1</line> 
     <part>123001A</part> 
     <qty>5</qty> 
     <price>10.25</price> 
    </item> 
    <item> 
     <line>2</line> 
     <part>456002B</part> 
     <qty>3</qty> 
     <price>20.50</price> 
    </item> 
    <item> 
     <line>3</line> 
     <part>789003C</part> 
     <qty>1</qty> 
     <price>41.00</price> 
    </item> 
    <orderSubTotal>133.25</orderSubTotal> 
    <tax>6.66</tax> 
    <shipping>10.00</shipping> 
    <orderTotal>149.91</orderTotal> 
</order> 
XML; 

$doc = new DOMDocument(); 
$doc->preserveWhiteSpace = false; 
$doc->loadXML($xml_req1); 

$arr = xml_to_arr($doc->documentElement); 

print "\n\n----\n\n"; 

print_r($arr); 

print "\n\n----\n\n"; 

$doc2 = new DOMDocument(); 
$doc2->preserveWhiteSpace = false; 
$doc2->loadXML($xml_req2); 

$arr2 = xml_to_arr($doc2->documentElement); 

print "\n\n----\n\n"; 

print_r($arr2); 

print "\n\n----\n\n"; 

exit; 

function xml_to_arr($curr_node) { 
    $val_array = array(); 
    $typ_array = array(); 

    foreach($curr_node->childNodes as $node) { 
     if ($node->nodeType == XML_ELEMENT_NODE) { 

      $val = xml_to_arr($node); 

      if (array_key_exists($node->tagName, $val_array)) { 

       if (!is_array($val_array[$node->tagName]) || $type_array[$node->tagName] == 'hash') { 
        $existing_val = $val_array[$node->tagName]; 
        unset($val_array[$node->tagName]); 
        $val_array[$node->tagName][0] = $existing_val; 
        $type_array[$node->tagName] = 'array'; 
       } 
       $val_array[$node->tagName][] = $val; 

      } else { 

       $val_array[$node->tagName] = $val; 
       if (is_array($val)) { 
        $type_array[$node->tagName] = 'hash'; 
       } 

      } // end if array key exists 

     } // end if elment node 
    }// end for each 

    if (count($val_array) == 0) { 
     return $curr_node->nodeValue; 
    } else { 
     return $val_array; 
    } 

} // end function xml to arr 

?> 

उदाहरण उत्पादन


---- 

Array 
(
    [PartnerID] => 5550000100-003 
    [PartnerType] => PTNR_INTER_CONSIGNEE 
    [OperatingUnit] => 100 
    [Status] => ACTIVE 
    [CustomerSeqNumber] => 111 
    [CustomerName] => Greg Co 
    [Address1] => 123 Any Ln 
    [Address2] => ? 
    [Address3] => ? 
    [Address4] => ? 
    [Address5] => ? 
    [City] => Somplace 
    [PostalCode] => 6
    [State] => CA 
    [CountryCode] => US 
    [TaxReference] => 222 
    [PartyRelated] => Y 
    [BusinessUnit] => GSBU 
    [Region] => GSRGN 
    [LocationName] => DBA Mac Head Computing 
    [LoadOnly] => N 
    [VSTM] => 333 
    [MilitaryCustomerFlag] => Y 
    [USFederalGovernmentCustomer] => Y 
    [Non-USGovernmentCustomer] => Y 
    [Vastera:EPCIActivity] => Array 
     (
      [EPCIActivityNuclearCode] => NUCLEAR 
      [EPCIActivityNuclearValue] => N 
      [EPCIActivityNuclearApproveDate] => 2011-05-16:07:19:37 
      [EPCIActivityNuclearExpireDate] => 2056-12-31:12:00:00 
      [EPCIActivityNuclearCountry] => US 
      [EPCIActivityChemBioCode] => CHEM_BIO 
      [EPCIActivityChemBioValue] => N 
      [EPCIActivityChemBioApproveDate] => 2011-05-16:07:19:37 
      [EPCIActivityChemBioExpireDate] => 2056-12-31:12:00:00 
      [EPCIActivityChemBioCountry] => US 
      [EPCIActivityMissileCode] => MISSILE 
      [EPCIActivityMissileValue] => N 
      [EPCIActivityMissileApproveDate] => 2011-05-16:07:19:37 
      [EPCIActivityMissileExpireDate] => 2056-12-31:12:00:00 
      [EPCIActivityMissileCountry] => US 
     ) 

    [SourceSystem] => GSB2BSS 
    [CreatedDate] => 2011-05-16:07:18:55 
    [CreatedBy] => c18530 
    [LastModifiedDate] => 2011-05-16:07:18:55 
    [LastModifiedBy] => c18530 
    [ContactName] => Greg, "Da Man" Skluacek 
    [ContactTitle] => Head Honcho 
    [ContactPhone] => 555-555-5555 
    [ContactFax] => 666-666-6666 
    [ContactEmail] => [email protected] 
    [ContactWeb] => www.gregco.com 
) 

---- 

Array 
(
    [orderNumber] => 123 
    [customerAddress] => Array 
     (
      [0] => Array 
       (
        [type] => Ship To 
        [name] => Bob McFly 
        [addr1] => 123 Lincoln St 
        [city] => Chicago 
        [state] => IL 
        [zip] => 60001 
       ) 

      [1] => Array 
       (
        [type] => Bill To 
        [name] => McFly Products Inc. 
        [addr1] => P.O. Box 6695 
        [city] => New York 
        [state] => NY 
        [zip] => 99081-6695 
       ) 

     ) 

    [item] => Array 
     (
      [0] => Array 
       (
        [line] => 1 
        [part] => 123001A 
        [qty] => 5 
        [price] => 10.25 
       ) 

      [1] => Array 
       (
        [line] => 2 
        [part] => 456002B 
        [qty] => 3 
        [price] => 20.50 
       ) 

      [2] => Array 
       (
        [line] => 3 
        [part] => 789003C 
        [qty] => 1 
        [price] => 41.00 
       ) 

     ) 

    [orderSubTotal] => 133.25 
    [tax] => 6.66 
    [shipping] => 10.00 
    [orderTotal] => 149.91 
) 

-------- 
2

अरे @Conrad मैं सिर्फ अपने कोड को संशोधित सांख्यिक सरणियों के साथ अच्छी तरह से काम करने के लिए:

/** 
* Build A XML Data Set 
* 
* @param array $data Associative Array containing values to be parsed into an XML Data Set(s) 
* @param string $startElement Root Opening Tag, default fx_request 
* @param string $xml_version XML Version, default 1.0 
* @param string $xml_encoding XML Encoding, default UTF-8 
* @return string XML String containig values 
* @return mixed Boolean false on failure, string XML result on success 
*/ 
public static function arrayToXML($data, $startElement = 'fx_request', $xml_version = '1.0', $xml_encoding = 'UTF-8'){ 
    if(!is_array($data)){ 
     $err = 'Invalid variable type supplied, expected array not found on line '.__LINE__." in Class: ".__CLASS__." Method: ".__METHOD__; 
     trigger_error($err); 
     if($this->_debug) echo $err; 
     return false; //return false error occurred 
    } 
    $xml = new XmlWriter(); 
    $xml->openMemory(); 
    $xml->startDocument($xml_version, $xml_encoding); 
    $xml->startElement($startElement); 

    /** 
    * Write XML as per Associative Array 
    * @param object $xml XMLWriter Object 
    * @param array $data Associative Data Array 
    */ 
    function write(XMLWriter $xml, $data){ 
     foreach($data as $key => $value){ 
      if (is_array($value) && isset($value[0])){ 
       foreach($value as $itemValue){ 
        //$xml->writeElement($key, $itemValue); 

        if(is_array($itemValue)){ 
         $xml->startElement($key); 
         write($xml, $itemValue); 
         $xml->endElement(); 
         continue; 
        } 

        if (!is_array($itemValue)){ 
         $xml->writeElement($key, $itemValue.""); 
        } 
       } 
      }else if(is_array($value)){ 
       $xml->startElement($key); 
       write($xml, $value); 
       $xml->endElement(); 
       continue; 
      } 

      if (!is_array($value)){ 
       $xml->writeElement($key, $value.""); 
      } 
     } 
    } 
    write($xml, $data); 

    $xml->endElement();//write end element 
    //returns the XML results 
    return $xml->outputMemory(true); 
} 

तो यो इस परिवर्तित कर सकते हैं:

$mArray["invitations"]["user"][0]["name"] = "paco"; 
$mArray["invitations"]["user"][0]["amigos"][0] = 82; 
$mArray["invitations"]["user"][0]["amigos"][1] = 29; 
$mArray["invitations"]["user"][0]["amigos"][2] = 6; 

$mArray["invitations"]["user"][1]["name"] = "jose"; 
$mArray["invitations"]["user"][1]["amigos"][0] = 43; 
$mArray["invitations"]["user"][1]["amigos"][1]["tuyos"] = 32; 
$mArray["invitations"]["user"][1]["amigos"][1]["mios"] = 79; 
$mArray["invitations"]["user"][1]["amigos"][2] = 11; 

$mArray["invitations"]["user"][2]["name"] = "luis"; 
$mArray["invitations"]["user"][2]["amigos"][0] = 65; 
इस xml में

:

<invitations> 
<user> 
    <name>paco</name> 
    <amigos>82</amigos> 
    <amigos>29</amigos> 
    <amigos>6</amigos> 
</user> 
<user> 
    <name>jose</name> 
    <amigos>43</amigos> 
    <amigos> 
     <tuyos>32</tuyos> 
     <mios>79</mios> 
    </amigos> 
    <amigos>11</amigos> 
</user> 
<user> 
    <name>luis</name> 
    <amigos>65</amigos> 
</user> 

मुझे आशा है कि मैं xml स्ट्रिंग से Assoc सरणी प्राप्त करने के लिए इस

+0

मैं हूँ अपने कोड को संशोधित करने और पोस्ट करते हैं उन्हें जवाब के रूप में अगर आप इस तरह Assoc सरणी बनाने –

3
class Xml { 

    public static function from_array($arr, $xml = NULL) 
    { 
     $first = $xml; 
     if($xml === NULL) $xml = new SimpleXMLElement('<root/>'); 
     foreach ($arr as $k => $v) 
     { 
      is_array($v) 
       ? self::from_array($v, $xml->addChild($k)) 
       : $xml->addChild($k, $v); 
     } 
     return ($first === NULL) ? $xml->asXML() : $xml; 
    } 

    public static function to_array($xml) 
    { 
     $xml = simplexml_load_string($xml); 
     $json = json_encode($xml); 
     return json_decode($json,TRUE); 
    } 

} 

$xml = xml::from_array($array); 
$array = xml::to_array($xml); 
0

सबसे आसान तरीका में किसी की सहायता कर सकते हैं:

<? 
$data_array = (array) simplexml_load_string($xml_string); 
?> 
1

यह एंजेल लोपेज के बनाता है जवाब। विशेषताओं के लिए समर्थन जोड़ा गया। यदि किसी तत्व में गुण हैं, तो उन्हें @ से उपसर्ग करें, और मूल तत्व सामग्री को कुंजी के रूप में खाली स्ट्रिंग के साथ देखें।इस एक्सएमएल में

$mArray["invitations"]["user"][0]["@name"] = "paco"; 
$mArray["invitations"]["user"][0][""]["amigos"][0] = 82; 
$mArray["invitations"]["user"][0][""]["amigos"][1] = 29; 
$mArray["invitations"]["user"][0][""]["amigos"][2] = 6; 

$mArray["invitations"]["user"][1]["@name"] = "jose"; 
$mArray["invitations"]["user"][1][""]["amigos"][0] = 43; 
$mArray["invitations"]["user"][1][""]["amigos"][1]["tuyos"] = 32; 
$mArray["invitations"]["user"][1][""]["amigos"][1]["mios"] = 79; 
$mArray["invitations"]["user"][1][""]["amigos"][2] = 11; 

$mArray["invitations"]["user"][2]["@name"] = "luis"; 
$mArray["invitations"]["user"][2][""]["amigos"][0] = 65; 

:

/** 
* Build an XML Data Set 
* 
* @param array $data Associative Array containing values to be parsed into an XML Data Set(s) 
* @param string $startElement Root Opening Tag, default fx_request 
* @param string $xml_version XML Version, default 1.0 
* @param string $xml_encoding XML Encoding, default UTF-8 
* @return string XML String containig values 
* @return mixed Boolean false on failure, string XML result on success 
*/ 
function arrayToXML($data, $startElement = 'fx_request', $xml_version = '1.0', $xml_encoding = 'UTF-8'){ 
    if(!is_array($data)){ 
    $err = 'Invalid variable type supplied, expected array not found on line '.__LINE__." in Class: ".__CLASS__." Method: ".__METHOD__; 
    trigger_error($err); 
    //if($this->_debug) echo $err; 
    return false; //return false error occurred 
    } 
    $xml = new XmlWriter(); 
    $xml->openMemory(); 
    $xml->startDocument($xml_version, $xml_encoding); 
    $xml->startElement($startElement); 

    /** 
    * Write keys in $data prefixed with @ as XML attributes, if $data is an array. When an @ prefixed key is found, a '' key is expected to indicate the element itself. 
    * @param object $xml XMLWriter Object 
    * @param array $data with attributes filtered out 
    */ 
    function writeAttr(XMLWriter $xml, $data) { 
    if(is_array($data)) { 
     $nonAttributes = array(); 
     foreach($data as $key => $val) { 
     //handle an attribute with elements 
     if($key[0] == '@') { 
      $xml->writeAttribute(substr($key, 1), $val); 
     } else if($key == '') { 
      if(is_array($val)) $nonAttributes = $val; 
      else $xml->text("$val"); 
     } 

     //ignore normal elements 
     else $nonAttributes[$key] = $val; 
     } 
     return $nonAttributes; 
    } 
    else return $data; 
    } 

    /** 
    * Write XML as per Associative Array 
    * @param object $xml XMLWriter Object 
    * @param array $data Associative Data Array 
    */ 
    function writeEl(XMLWriter $xml, $data) { 
    foreach($data as $key => $value) { 
     if(is_array($value) && isset($value[0])) { //numeric array 
     foreach($value as $itemValue){ 
      if(is_array($itemValue)) { 
      $xml->startElement($key); 
      $itemValue = writeAttr($xml, $itemValue); 
      writeEl($xml, $itemValue); 
      $xml->endElement(); 
      } else { 
      $itemValue = writeAttr($xml, $itemValue); 
      $xml->writeElement($key, "$itemValue"); 
      } 
     } 
     } else if(is_array($value)) { //associative array 
     $xml->startElement($key); 
     $value = writeAttr($xml, $value); 
     writeEl($xml, $value); 
     $xml->endElement(); 
     } else { //scalar 
     $value = writeAttr($xml, $value); 
     $xml->writeElement($key, "$value"); 
     } 
    } 
    } 
    writeEl($xml, $data); 

    $xml->endElement();//write end element 
    //returns the XML results 
    return $xml->outputMemory(true); 
} 

तो यो इस परिवर्तित कर सकते हैं

<invitations> 
    <user name="paco"> 
    <amigos>82</amigos> 
    <amigos>29</amigos> 
    <amigos>6</amigos> 
    </user> 
    <user name="jose"> 
    <amigos>43</amigos> 
    <amigos> 
     <tuyos>32</tuyos> 
     <mios>79</mios> 
    </amigos> 
    <amigos>11</amigos> 
    </user> 
    <user name="luis"> 
    <amigos>65</amigos> 
    </user> 
</invitations> 

धन्यवाद एंजेल।

+0

कूल लेकिन काम नहीं करता है: 'सरणी ('123' => 'asdf')' शायद आपको संख्या होने के लिए प्रत्येक कुंजी की जांच करनी चाहिए। – jmarceli

0
/** 
* Write XML as per Associative Array 
* @param object $xml XMLWriter Object 
* @param array $data Associative Data Array 
*/ 
function writeXmlRecursive(XMLWriter $xml, $data){ 
    foreach($data as $key => $value){ 
     if (is_array($value) && isset($value[0])){ 
      $xml->startElement($key); 
      foreach($value as $itemValue){ 

       if(is_array($itemValue)){ 
        writeXmlRecursive($xml, $itemValue); 
       } 
       else 
       { 
        $xml->writeElement($key, $itemValue.""); 
       } 
      } 
      $xml->endElement(); 

     }else if(is_array($value)){ 
      $xml->startElement($key); 
      writeXmlRecursive($xml, $value); 
      $xml->endElement(); 
      continue; 
     } 

     if (!is_array($value)){ 
      $xml->writeElement($key, $value.""); 
     } 
    } 
} 

यह अंतिम संस्करण, दे कि ahat मैं सरणी से 4 नेस्ट किए गए स्तर

<items> 
<item> 
    <id_site>59332</id_site> 
    <id>33</id> 
    <code>196429985</code> 
    <tombid>23</tombid> 
    <tombcode>196429985</tombcode> 
    <religion></religion> 
    <lastname>lastname</lastname> 
    <firstname>name</firstname> 
    <patronymicname>patronymicname</patronymicname> 
    <sex>1</sex> 
    <birthday>2</birthday> 
    <birthmonth>4</birthmonth> 
    <birthyear>1946</birthyear> 
    <deathday>13</deathday> 
    <deathmonth>5</deathmonth> 
    <deathyear>2006</deathyear> 
    <s_comments></s_comments> 
    <graveyard>17446</graveyard> 
    <latitude></latitude> 
    <longitude></longitude> 
    <images> 
    <image> 
    <siteId>52225</siteId> 
    <fileId>62</fileId> 
    <prefix>0</prefix> 
    <path>path</path> 
    </image> 
    <image> 
    <siteId>52226</siteId> 
    <fileId>63</fileId> 
    <prefix>0</prefix> 
    <path>path</path> 
    </image> 
    </images> 
</item> 
<items> 
1

जवाब के आधार पर यहाँ मैं बनाया GitHub रेपो https://github.com/jmarceli/array2xml

शायद नहीं पर सुंदर रेपो के साथ चाहते है इंटरनेट लेकिन कोड ठीक काम कर रहा है। बस ArrayToXML क्लास का उपयोग

// Based on: http://stackoverflow.com/questions/99350/passing-php-associative-arrays-to-and-from-xml 
class ArrayToXML { 
    private $version; 
    private $encoding; 
    /* 
    * Construct ArrayToXML object with selected version and encoding 
    * 
    * for available values check XmlWriter docs http://www.php.net/manual/en/function.xmlwriter-start-document.php 
    * @param string $xml_version XML Version, default 1.0 
    * @param string $xml_encoding XML Encoding, default UTF-8 
    */ 
    public function __construct($xmlVersion = '1.0', $xmlEncoding = 'UTF-8') { 
    $this->version = $xmlVersion; 
    $this->encoding = $xmlEncoding; 
    } 
    /** 
    * Build an XML Data Set 
    * 
    * @param array $data Associative Array containing values to be parsed into an XML Data Set(s) 
    * @param string $startElement Root Opening Tag, default data 
    * @return string XML String containig values 
    * @return mixed Boolean false on failure, string XML result on success 
    */ 
    public function buildXML($data, $startElement = 'data'){ 
    if(!is_array($data)){ 
     $err = 'Invalid variable type supplied, expected array not found on line '.__LINE__." in Class: ".__CLASS__." Method: ".__METHOD__; 
     trigger_error($err); 
     //if($this->_debug) echo $err; 
     return false; //return false error occurred 
    } 
    $xml = new XmlWriter(); 
    $xml->openMemory(); 
    $xml->startDocument($this->version, $this->encoding); 
    $xml->startElement($startElement); 
    $this->writeEl($xml, $data); 
    $xml->endElement();//write end element 
    //returns the XML results 
    return $xml->outputMemory(true); 
    } 
    /** 
    * Write keys in $data prefixed with @ as XML attributes, if $data is an array. 
    * When an @ prefixed key is found, a '%' key is expected to indicate the element itself, 
    * and '#' prefixed key indicates CDATA content 
    * 
    * @param object $xml XMLWriter Object 
    * @param array $data with attributes filtered out 
    */ 
    protected function writeAttr(XMLWriter $xml, $data) { 
    if(is_array($data)) { 
     $nonAttributes = array(); 
     foreach($data as $key => $val) { 
     //handle an attribute with elements 
     if($key[0] == '@') { 
      $xml->writeAttribute(substr($key, 1), $val); 
     } else if($key[0] == '%') { 
      if(is_array($val)) $nonAttributes = $val; 
      else $xml->text($val); 
     } elseif($key[0] == '#') { 
      if(is_array($val)) $nonAttributes = $val; 
      else { 
      $xml->startElement(substr($key, 1)); 
      $xml->writeCData($val); 
      $xml->endElement(); 
      } 
     } 
     //ignore normal elements 
     else $nonAttributes[$key] = $val; 
     } 
     return $nonAttributes; 
    } 
    else return $data; 
    } 
    /** 
    * Write XML as per Associative Array 
    * 
    * @param object $xml XMLWriter Object 
    * @param array $data Associative Data Array 
    */ 
    protected function writeEl(XMLWriter $xml, $data) { 
    foreach($data as $key => $value) { 
     if(is_array($value) && !$this->isAssoc($value)) { //numeric array 
     foreach($value as $itemValue){ 
      if(is_array($itemValue)) { 
      $xml->startElement($key); 
      $itemValue = $this->writeAttr($xml, $itemValue); 
      $this->writeEl($xml, $itemValue); 
      $xml->endElement(); 
      } else { 
      $itemValue = $this->writeAttr($xml, $itemValue); 
      $xml->writeElement($key, "$itemValue"); 
      } 
     } 
     } else if(is_array($value)) { //associative array 
     $xml->startElement($key); 
     $value = $this->writeAttr($xml, $value); 
     $this->writeEl($xml, $value); 
     $xml->endElement(); 
     } else { //scalar 
     $value = $this->writeAttr($xml, $value); 
     $xml->writeElement($key, "$value"); 
     } 
    } 
    } 
    /* 
    * Check if array is associative with string based keys 
    * FROM: http://stackoverflow.com/questions/173400/php-arrays-a-good-way-to-check-if-an-array-is-associative-or-sequential/4254008#4254008 
    * 
    * @param array $array Array to check 
    */ 
    protected function isAssoc($array) { 
    return (bool)count(array_filter(array_keys($array), 'is_string')); 
    } 
} 

उसके बाद:

यहाँ कोड है जो इस्तेमाल किया जा सकता है। उदाहरण:

$xml = new ArrayToXML(); 
print $xml->buildXML($input);