使用JavaScript访问XML节点值

时间:2013-08-27 15:12:00

标签: javascript xml ajax

我有一个XML文件,结构如下:

<FIELDS>
    <GRP1>
       <OPTION>
            <VALUE>71</VALUE>
            <CONTENT>Text</CONTENT>
       </OPTION>
       ...
       ...
    </GRP1>
    <GRP2>
       <OPTION>
            <VALUE>77</VALUE>
            <CONTENT>Test</CONTENT>
       </OPTION>
    </GRP2>
      ...
      ...
</FIELDS>

我需要将<OPTIONS>的所有子节点的节点值作为父节点获取<GRP1>。 我尝试了以下代码,但它不起作用:

// [...]
var xmlGRP = xmlDoc.getElementsByTagName(GRP1);
xmlvalue = xmlGRP.childNodes[0].childNodes[0].firstChild.nodeValue;
xmlcontent = xmlGRP.childNodes[0].childNodes[1].firstChild.nodeValue;

有谁能告诉我我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

  1. 除非您定义了名为GRP1的变量,否则该变量应为字符串'GRP1'

  2. xmlGRP直接是NodeList,而不是Node;你不需要查看它上面的childNodes属性。

  3. 由于空格处理方面的潜在差异,访问编号childNodes是不可靠的。

  4. 对于空字符串的情况,访问firstChild会失败,因为该元素没有Text节点子节点。

  5. 尝试类似:

    var grp1 = xmlDoc.getElementsByTagName('GRP1')[0];
    var firstOption = grp1.getElementsByTagName('OPTION')[0];
    var value = firstOption.getElementsByTagName('VALUE')[0].textContent;
    var content = firstOption.getElementsByTagName('CONTENT')[0].textContent;
    

    (请注意,textContent是IE Level及以下版本不支持的DOM Level 3 Core属性。如果您需要支持该浏览器,您可以使用类似工作,例如:)

    function getTextContent(node) { // not 100% DOM3 compliant... good enough
        if ('textContent' in node)
            return node.textContent;
        var texts = [];
        for (child = node.firstChild; child!==null; child = child.nextSibling) {
            if (child.nodeType===1) // ELEMENT_NODE
                texts.push(getTextContent(child));
            else if (child.nodeType===3 || child.nodeType===4) // TEXT_NODE, CDATA_SECTION_NODE
                texts.push(child.data);
        }
        return texts.join('');
    }