Передача ассоциативных массивов PHP к и от XML

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

17
задан random 13 November 2011 в 16:47
поделиться

8 ответов

Для тех из вас, кто не использует пакеты PEAR, но у вас установлен 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); 
}
6
ответ дан 30 November 2019 в 11:38
поделиться

Следующий класс использует simplexml для достижения того же, просто необходимо циклично выполниться через массив и назвать addchild ximplexml.

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

0
ответ дан 30 November 2019 в 11:38
поделиться

Я соглашаюсь, что это - одна область, что документация PHP допустила ошибку, но для меня я всегда использовал SimpleXML, смешанный с чем-то как функции xml2Array. Xml, который Вы получаете от simpleXML, не то, что трудно для навигации с помощью дампа функционируют как print_r.

1
ответ дан 30 November 2019 в 11:38
поделиться

Вы видели ГРУШЕВЫЙ пакет XML_Serializer?

pear_php_XML_Serializer

2
ответ дан 30 November 2019 в 11:38
поделиться

Походит на задание для 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>
2
ответ дан 30 November 2019 в 11:38
поделиться

Попробуйте Платформу Zend_Config и Зенда в целом.

я предполагаю, что это были бы 2 процесса шага: выстройте к Zend_Config, Zend_Config к XML.

2
ответ дан 30 November 2019 в 11:38
поделиться

У меня были некоторые из этих тех же проблем, и таким образом, я создал два класса:

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].

Оба из методов производят себя как Arrays и Xml, таким образом, можно перейти беспрепятственно между ними. Таким образом, Вы можете $oXml->AsArray();, или $oArray->AsXml(); я нашел, что было легче сделать это, чем постоянно передать вещи назад и вперед между array2xml или xml2array методами.

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

, который Оба класса, может быть переопределен для создания пользовательского класса из выбора и может использоваться друг независимо от друга.

3
ответ дан 30 November 2019 в 11:38
поделиться

SimpleXML работает отлично для Вашего использования.

13
ответ дан 30 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: