Как перемещаться по структуре узла JSON

#javascript #jquery #xml #json

#javascript #jquery #xml #json

Вопрос:

В настоящее время я разрабатываю расширение Chrome, которое вызывает веб-сервис, который отправляет мне XML-сообщение SOAP. Когда я получил это сообщение, я должен был перейти по нему, чтобы проанализировать его, но у меня возникли некоторые проблемы с этим.

Структура xml выглядит следующим образом :

 <?xml version="1.0" encoding="UTF-8"?>

<env:Envelope     xmlns:env="http://www.w3.org/2003/05/soap-envelope"     
            xmlns:ns1="/service.php?service=components" 

            xmlns:enc="http://www.w3.org/2003/05/soap-encoding" 

            xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 

            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


<env:Body xmlns:rpc="http://www.w3.org/2003/05/soap-rpc">

<ns1:getComponentsResponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<rpc:result>return</rpc:result>

<return enc:itemType="enc:Struct" enc:arraySize="7" xsi:type="enc:Array">

<item xsi:type="enc:Struct">
        <m_type xsi:type="xsd:string">image</m_type>
        <m_params enc:itemType="enc:Struct" enc:arraySize="4" xsi:type="enc:Array">
            <item xsi:type="enc:Struct">
                <m_name xsi:type="xsd:string">image</m_name>
                <m_value xsi:type="xsd:string">9f00de47f9f07ec0c7389875e4739c2b.png</m_value>
                <m_numType xsi:type="xsd:int">3</m_numType>
            </item>
            <item xsi:type="enc:Struct">
                <m_name xsi:type="xsd:string">weblink</m_name>
                <m_value xsi:type="xsd:string">http://www.xxx.com</m_value>
                <m_numType xsi:type="xsd:int">2</m_numType>
            </item>
            <item xsi:type="enc:Struct">
                <m_name xsi:type="xsd:string">redirect-type</m_name>
                <m_value xsi:type="xsd:string">2</m_value>
                <m_numType xsi:type="xsd:int">0</m_numType>
            </item>
            <item xsi:type="enc:Struct">
                <m_name xsi:type="xsd:string">is-logo</m_name>
                <m_value xsi:type="xsd:string">1</m_value>
                <m_numType xsi:type="xsd:int">0</m_numType>
            </item>
        </m_params>
        <m_order xsi:type="xsd:int">0</m_order>
        <m_childs enc:itemType="xsd:anyType" enc:arraySize="0" xsi:type="enc:Array"/>
        <m_id xsi:type="xsd:int">119</m_id>
        <m_name xsi:type="xsd:string">image_4d624ce18aeb3</m_name>
    </item>
  

Код выглядит следующим образом :

 var json = $.xmlToJSON(xmlhttp.responseXML);
alert(json.item[0].length);
  

Итак, в основном мне нужно перемещаться по «элементу», но это не сработало, и я не понимаю, по какой причине…

Ответ №1:

Поскольку XML имеет только один корневой тег, когда подключаемый модуль xmlToJSON выполняет синтаксический анализ, кажется, что он не обрабатывает верхний уровень <item/> как дочерний, а скорее как корень самого объекта.

Я бы попробовал:

 alert(json.m_name);
  

… или любой другой дочерний элемент, который вас заинтересовал.

Если эта реализация соответствует http://www.terracoder.com/index.php/xml-objectifier/xml-objectifier-examples, вы можете сделать:

 alert(root._children.length);
  

Я бы использовал утилиту, подобную http://phpjs.org/functions/var_export:578 (или сделайте это самостоятельно, используя for…in ) чтобы поразмышлять над такими объектами, как эти, чтобы вы могли сами увидеть, каковы его компоненты.

Обновить

Я ничего не знаю об использовании jQuery с расширениями Chrome, поэтому мои тесты проводились с автономной версией. Вы могли бы попробовать сначала проверить, что ваш XML работает с этим, и перейти оттуда. Например, это работает, если вы включаете XMLObjectifier из http://www.terracoder.com/scripts/saXMLUtils.js сначала:

 // XML truncated to be well-formed
var xml = '<?xml version="1.0" encoding="UTF-8"?>
    <item     xmlns:env="http://www.w3.org/2003/05/soap-envelope"
        xmlns:ns1="/service.php?service=components" 
        xmlns:enc="http://www.w3.org/2003/05/soap-encoding" 
        xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"
        xsi:type="enc:Struct">
    <m_type xsi:type="xsd:string">image</m_type>
    <m_params enc:itemType="enc:Struct" enc:arraySize="4" xsi:type="enc:Array">
        <item xsi:type="enc:Struct">
            <m_name xsi:type="xsd:string">image</m_name>
            <m_value xsi:type="xsd:string">9f00de47f9f07ec0c7389875e4739c2b.png</m_value>
            <m_numType xsi:type="xsd:int">3</m_numType>
        </item>
        <item xsi:type="enc:Struct">
            <m_name xsi:type="xsd:string">weblink</m_name>
            <m_value xsi:type="xsd:string">http://www.xxx.com</m_value>
            <m_numType xsi:type="xsd:int">2</m_numType>
        </item>
        <item xsi:type="enc:Struct">
            <m_name xsi:type="xsd:string">redirect-type</m_name>
            <m_value xsi:type="xsd:string">2</m_value>
            <m_numType xsi:type="xsd:int">0</m_numType>
        </item>
        <item xsi:type="enc:Struct">
            <m_name xsi:type="xsd:string">is-logo</m_name>
            <m_value xsi:type="xsd:string">1</m_value>
            <m_numType xsi:type="xsd:int">0</m_numType>
        </item>
    </m_params>
    <m_order xsi:type="xsd:int">0</m_order>
    <m_childs enc:itemType="xsd:anyType" enc:arraySize="0" xsi:type="enc:Array"/>
    <m_id xsi:type="xsd:int">119</m_id>
    <m_name xsi:type="xsd:string">image_4d624ce18aeb3</m_name>
</item>';

    // DOMParser is only Firefox/Safari/Chrome/IE9  but convenient for debugging:
xml = new DOMParser().parseFromString(xml, 'text/xml');
var json = XMLObjectifier.xmlToJSON(xml);
var str = '';
for (var i in json) {
    str  = i   '::'   json[i]   'n';
}
alert(str);
  

Вы также можете попробовать это на своем XML:

 var xmlString = new XMLSerializer().serializeToString(xmlhttp.responseXML);
alert(xmlString);
  

Комментарии:

1. Нет, это не сработало… Все время говорит «неопределенная» ссылка из terracoder, это та, с которой я пришел 😉

2. Вы уверены, что XML правильно сформирован. У меня это работает с автономной версией, когда XML правильно сформирован (ваш XML выше неправильно сформирован).

3. Если вы вставите свой полный XML, мы сможем взглянуть на то, что может происходить. Вы подтвердили, что responseXML — это вообще XML? Это может быть === null, если есть проблема с XML.

4. Как я уже говорил вам, это всего лишь часть моего xml. Я только что проверил: if (json == null), и он не вводится в него. Итак, мой Xml, кажется, хорошо сформирован. Основная проблема в том, что я не знаю, как я могу перемещаться…

5. Я действительно ценю твою помощь, чувак. Я протестировал ваш код, первый верните мне это: img715.imageshack.us/i/unledjls.png И второй верните мне весь мой XML-файл.