سؤال

هل هناك طريقة سهلة المشير PHP النقابي من XML ؟ على سبيل المثال لدي مجموعة التالية:

$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>

لا يهمني إذا كنت مضطرا إلى تغيير مجموعة هيكل قليلا أو إذا XML الذي يخرج يختلف عن المثال أعلاه.كنت أحاول العمل مع PHP XMLReader و XMLWriter, لكن الوثائق فقيرة جدا ومدونة لقد أنتجت نتيجة تبدو شيء مثل ما أشعر أنه ينبغي أن تبدو وكأنها:

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

هل حقا يجب أن يكون أصعب من ذلك للحصول على الأساسية الخام XML تفريغ PHP مجموعة دون كتابة بلدي مخصص الصف ؟

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

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

المحلول

لأولئك منكم عدم استخدام الكمثرى حزم, ولكن كنت قد حصلت على 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); 
}

نصائح أخرى

SimpleXML يعمل كبيرة للاستخدام الخاص بك.

لقد كان بعض هذه القضايا نفسها ، لذلك أنا خلقت فئتين:

bXml

الطبقة تمتد SimpleXml ويصحح بعض المشاكل لديه.مثل عدم القدرة على إضافة CData العقد أو تعليق العقد.أود أيضا أن أضيف بعض الميزات الإضافية ، مثل استخدام php تيارات وظائف لإضافة العقد الأطفال $oXml->AddChild("file:///user/data.xml") أو إضافة سلسلة XML الطفل العقد مثل $oXml->AddChild("<more><xml>yes</xml></more>"); ولكن أساسا أنا فقط أردت إصلاح simpleXML المشاكل.

bArray

لقد مدد ArrayObject فئة بحيث كل مجموعة وظيفة يمكن أن تكون وجوه المنحى و ثابت, لذلك أنت لا تحتاج إلى تذكر أن array_walk تعمل على مجموعة واسعة من قبل المرجعية ، في حين array_filter تعمل على مجموعة من القيمة.لذلك يمكنك أن تفعل أشياء مثل $oArray->flip()->Reverse()->Walk(/*callback*/); ثم لا يزال الوصول إلى القيمة بنفس الطريقة التي عادة مثل $oArray[key].

سواء من أساليب الإخراج أنفسهم المصفوفات و Xml حتى تتمكن من القفز بسهولة بين لهم.حتى تتمكن من $oXml->AsArray(); أو $oArray->AsXml(); لقد وجدت أنه من الأسهل أن تفعل هذا باستمرار تمرير الأشياء ذهابا وإيابا بين array2xml أو xml2array الأساليب.

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

كل الطبقات يمكن تجاوزها لجعل فئة مخصصة من اختيارك ويمكن استخدامها بشكل مستقل عن بعضها البعض.

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);

محاولة Zend_Config و الإطار زند بشكل عام.

أتصور أنه سيكون 2 خطوة عملية:مجموعة Zend_Config, Zend_Config إلى XML.

يبدو وكأنه عمل. SimpleXML.

أود أن أقترح مختلفة قليلا XML هيكل..

وأتساءل لماذا تحتاج إلى تحويل من صفيف -- > XML و العودة..إذا كان يمكنك تعديل مجموعة هيكل كما قلت لماذا لا مجرد إنشاء XML بدلا من ذلك ؟ إذا كان بعض قطعة من رمز موجود بالفعل أن يأخذ ذلك تكوين مجموعة, مجرد تعديل على قبول 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>

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


<?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>gskluzacek@gregco.com</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] => 60123
    [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] => gskluzacek@gregco.com
    [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
)

--------

مرحبا @كونراد أنا فقط تعديل التعليمات البرمجية للعمل بشكل جيد مع المصفوفات الرقمية:

/**
 * 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_Serializer?

pear_php_XML_Serializer

أنا أوافق هذا هو أحد المجالات التي PHP وثائق انخفض الكرة, ولكن بالنسبة لي كنت دائما تستخدم SimpleXML مختلطة مع شيء مثل xml2Array وظائف.Xml من simpleXML ليس من الصعب للتنقل مع مساعدة من الإغراق وظيفة مثل print_r.

هذا يبني على أنخيل لوبيز الجواب.واضاف لدعم الصفات.إذا كان عنصر لديه الصفات ، البادئة لهم @ و الرجوع إلى العنصر الفعلي المحتوى مع سلسلة فارغة الرئيسية.

/**
 * 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);
}

لذا أنت يمكن تحويل هذا:

$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">
    <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>

شكرا أنجيل.

استنادا إلى الإجابات هنا جعلت جيثب الريبو https://github.com/jmarceli/array2xml

ربما لا أجمل الريبو على الإنترنت لكن رمز يبدو أن تعمل بشكل جيد.

هنا هو التعليمات البرمجية التي يمكن استخدامها:

// 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'));
  }
}

بعد أن مجرد استخدام ArrayToXML فئة.على سبيل المثال:

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

الفئة التالية يستخدم simplexml لتحقيق نفس, تحتاج فقط إلى حلقة من خلال مجموعة وندعو addchild من ximplexml.

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

أبسط طريقة للحصول على assoc مجموعة من سلسلة xml:

<?
$data_array = (array) simplexml_load_string($xml_string);
?>
/**
 * 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top