#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-файл.