Каков наилучший способ обработки этого XML-канала? - PullRequest
1 голос
/ 02 декабря 2010

У меня есть XML-документ, который дает мне адреса.Вот выдержка:

<ezi:orderaddresses>
        <ezi:orderaddress>
            <ezi:addresstype>billing</ezi:addresstype>
            <ezi:name>Jason Fonseca</ezi:name>
            <ezi:companyname>Cyber</ezi:companyname>
            <ezi:address1>8 springstein</ezi:address1>
            <ezi:division>NT</ezi:division>
            <ezi:postalcode>34245</ezi:postalcode>
            <ezi:countrycode>AU</ezi:countrycode>
            <ezi:email>jason@bigcreative.com.au</ezi:email>
            <ezi:phone>89549854</ezi:phone>
            <ezi:mobilephone>984590598</ezi:mobilephone>
        </ezi:orderaddress>
        <ezi:orderaddress>
            <ezi:addresstype>shipping</ezi:addresstype>
            <ezi:name>Jason Fonseca</ezi:name>
            <ezi:companyname>Cyber</ezi:companyname>
            <ezi:address1>8 springstein</ezi:address1>
            <ezi:division>NT</ezi:division>
            <ezi:postalcode>34245</ezi:postalcode>
            <ezi:countrycode>AU</ezi:countrycode>
            <ezi:email>jason@bigcreative.com.au</ezi:email>
            <ezi:phone>89549854</ezi:phone>
        </ezi:orderaddress>
        </ezi:orderaddresses>

В дополнение к вышеуказанному формату двух тегов "orderaddress", также может быть один, например:

      <ezi:orderaddresses>
        <ezi:orderaddress>
            <ezi:addresstype>billing</ezi:addresstype>
            <ezi:name>Jason Fonseca</ezi:name>
            <ezi:companyname>Cyber</ezi:companyname>
            <ezi:address1>8 springstein</ezi:address1>
            <ezi:division>NT</ezi:division>
            <ezi:postalcode>34245</ezi:postalcode>
            <ezi:countrycode>AU</ezi:countrycode>
            <ezi:email>jason@bigcreative.com.au</ezi:email>
            <ezi:phone>89549854</ezi:phone>
            <ezi:mobilephone>984590598</ezi:mobilephone>
        </ezi:orderaddress>
        </ezi:orderaddresses>

Что я нахожу, что когдаиспользуя простой xml для интерпретации этого, в первом случае я получаю следующее:

 [orderaddresses] => SimpleXMLElement Object
    (
        [orderaddress] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [addresstype] => billing
                        [name] => Jason Fonseca
                        [companyname] => Cyber
                        [address1] => 8 springstein
                        [division] => NT
                        [postalcode] => 34245
                        [countrycode] => AU
                        [email] => jason@bigcreative.com.au
                        [phone] => 89549854
                        [mobilephone] => 984590598
                    )

                [1] => SimpleXMLElement Object
                    (
                        [addresstype] => shipping
                        [name] => Jason Fonseca
                        [companyname] => Cyber
                        [address1] => 8 springstein
                        [division] => NT
                        [postalcode] => 34245
                        [countrycode] => AU
                        [email] => jason@bigcreative.com.au
                        [phone] => 89549854
                    )

            )

    )

И во втором случае я получаю следующее:

   [orderaddresses] => SimpleXMLElement Object
        (
            [orderaddress] => SimpleXMLElement Object
                (
                    [addresstype] => billing
                    [name] => Jason Fonseca
                    [companyname] => Cyber
                    [address1] => 8 springstein
                    [division] => NT
                    [postalcode] => 34245
                    [countrycode] => AU
                    [email] => jason@bigcreative.com.au
                    [phone] => 89549854
                    [mobilephone] => 984590598
                )

        )

Наблюдатель, Кин заметитчто теперь, если я попытаюсь получить доступ к orderaddresses-> orderaddress, то это будет иметь другую структуру в зависимости от того, есть ли два адреса (или больше) или только один адрес.Пример 2 это числовой индексный массив, пример два - это ассоциативный объект.

Для стандартизации я использовал некоторый код, который выглядит следующим образом:

if(!isset($content['orderlines']['orderline'][0]))
    {
        $temp = $content['orderlines']['orderline'];
        unset($content['orderlines']['orderline']);
        $content['orderlines']['orderline'][0] =$temp;
    }

(вымогу игнорировать тот факт, что я использую ассоциативные массивы здесь, у меня есть подпрограмма, которая выполняет преобразование, но я проверил, и эта подпрограмма не меняет результат).

У меня вопрос, какЯ должен правильно интерпретировать эти данные?Имея этот кусочек кода каждый раз, когда я пытаюсь получить доступ к порядковому адресу и строкам заказа, это действительно грязно.Нет ли лучшего способа?

Мне пришла в голову мысль о том, чтобы отредактировать мою процедуру преобразования, чтобы справиться с этим.Если вы думаете, что это путь, то дайте мне знать, но я подумал, что эта проблема наверняка возникнет много, и у кого-то должно быть умное и краткое решение?

Спасибо

1 Ответ

1 голос
/ 02 декабря 2010

Согласно документации для simplexml , вы всегда должны иметь возможность перебирать и индексировать свойства, даже если есть только одно из них, это может быть «лучшим» способом достижения того, чего вы хотите.например:

for($xml->thingThereMayBeOneOrMoreOf as $item) {
  //handle $item
}

или, если вам нужно обработать только первый элемент

$item=$xml->thingThereMayBeOneOrMoreOf[0];
//handle $item

Кроме того, согласно документации, эти свойства фактически не являются массивами, но доступны (доступны по подписке)и итерируемые свойства, только то, что var_dump и т. д. преобразует их в / рассматривает их как массивы для целей создания дампа.

На самом деле я не проверял это, уммм.

...