如何浏览JSON节点结构

时间:2011-04-18 10:15:17

标签: javascript jquery xml json

我目前正在开发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);

所以基本上我需要浏览“项目”,但它不起作用,我不明白为什么...

1 个答案:

答案 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);