【问题标题】:How to navigating through JSON node structure如何在 JSON 节点结构中导航
【发布时间】:2011-04-18 10:15:17
【问题描述】:

我目前正在开发一个 Chrome 扩展程序,它调用一个向我发送 SOAP XML 消息的网络服务。当我收到这条消息时,我必须在上面导航才能解析它,但我遇到了一些问题。

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

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

【问题讨论】:

    标签: javascript jquery xml json


    【解决方案1】:

    由于XML只有一个根标签,所以xmlToJSON插件在解析的时候,似乎并没有把最顶层的&lt;item/&gt;当成一个孩子,而是把它当成对象本身的根。

    我会尝试:

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

    【讨论】:

    • 不,它没用...一直说“未定义”来自 terracoder 的链接,是我来自的链接;)
    • 您确定 XML 格式正确吗?当 XML 格式正确(您上面的 XML 格式不正确)时,它适用于独立版本。
    • 如果您粘贴完整的 XML,我们可以看看会发生什么。您是否确认 responseXML 甚至是 XML?如果 XML 有问题,它可能是 === null。
    • 我告诉你这只是我的 xml 的一部分。我刚刚测试过: if(json == null) 并且它没有输入。所以我的 Xml 似乎格式正确。主要问题是我不知道如何导航......
    • 非常感谢您的帮助。我已经测试了你的代码,第一个给我这个:img715.imageshack.us/i/unledjls.png 第二个给我所有的 XML 文件。
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2016-10-22
    • 2010-12-12
    相关资源
    最近更新 更多