我目前正在开发Chrome扩展程序,该扩展程序调用向我发送SOAP XML消息的Web服务。当我收到此消息时,我必须在其上导航以解析它,但我遇到了一些问题。
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);
所以基本上我需要浏览“项目”,但它不起作用,我不明白为什么...
答案 0 :(得分:0)
由于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的工作原理,然后从那里开始。例如,如果您首先包含来自http://www.terracoder.com/scripts/saXMLUtils.js的XMLObjectifier,则此方法有效:
// 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);