使用javascript解析XML字符串

时间:2012-02-22 18:11:01

标签: javascript

大家好,我有一段时间试图解析一个xml字符串。字符串看起来像这样。

             <sheetData>
                <row r="1" spans="1:12" x14ac:dyDescent="0.25">
                  <c r="A1">
                    <v>1</v>
                  </c>
                  <c r="B1" t="s">
                    <v>3</v>
                  </c>
                  <c r="C1" t="s">
                    <v>2</v>
                  </c>
                  <c r="F1" t="s">
                    <v>0</v>
                  </c>
                  <c r="L1" t="s">
                    <v>1</v>
                  </c>
                </row>
                <row r="2" spans="1:12" x14ac:dyDescent="0.25">
                  <c r="A2">
                    <v>1</v>
                  </c>
                  <c r="B2" t="s">
                    <v>4</v>
                  </c>
                </row>
                <row r="4" spans="1:12" x14ac:dyDescent="0.25">
                  <c r="I4">
                    <v>7</v>
                  </c>
                </row>
              </sheetData>

我搜索过并搜索过,但我一直在寻找的是如何使用jquery或javascript读取xml文件,这似乎不符合我的要求。

这是我创建并试用的代码,但我一直都在失败。

                var len = xmlDoc2.getElementsByTagName("row")[0].childNodes.length;

                  for (var i=0; i < (TotalSheetNodes*len); i++){


                    mysheet.innerHTML +=(xmlDoc2.getElementsByTagName("c")[i].getAttribute("r") ) + "</br>";

                    var v1 = (xmlDoc2.getElementsByTagName("c")[i].getAttribute("r") );


                    /*if the element does not have an attribute of t then add it to then add it to the dictionary*/
                    if (xmlDoc2.getElementsByTagName("c")[i].getAttribute("t") == null)
                    {   
                        var v2 = xmlDoc2.getElementsByTagName("v")[i].childNodes[0].nodeValue

                            Jcell.Dictionary[v1]= v2

                    }
                    //else addid to the sheet element so we can extract the value later  from shared string.
                    else{
                    Jcell.Sheet[(v1)] = v1;

                    }
由于这条线,它失败了。

                var len = xmlDoc2.getElementsByTagName("row")[0].childNodes.length;

所以这是我的基本问题是什么是将所有子节点置于“行”下的最简单方法?另外,我想决定子节点是否具有属性“T” 我想将值分配给不同的对象变量。 非常感谢您的回复。 我真的很想用普通的JavaScript来做这件事,而且更喜欢远离任何图书馆。

1 个答案:

答案 0 :(得分:1)

您确定xmlDoc2.getElementsByTagName("row")至少有一个结果吗?否则,语法似乎没问题。

此外,您的脚本代码段中缺少大量初始化,否则我们将无法为您提供帮助。

  • xmlDoc2 - 这是一个解析良好的XML文档对象(或错误消息吗?)
  • TotalSheetNodes是什么?
  • mysheet似乎是一个HTML元素?
  • 什么是JCell?这似乎与这个问题无关。

编辑:

要遍历(似乎是正确的词,而不是“解析”)您的XML文档,您应该自己遍历每个NodeList。这可能,每个元素都继承了Node接口,而不仅仅是xml文档对象 - 正如你所想的那样。

此外,您不必计算row s,因为您只对c感兴趣。一个很大的错误似乎是你的(整个)文档中c的数量的aritmethic近似,通过在第一行中复制数量为c个元素的数量 - 你的xml源证明这是错误的。

var rows = xmlDoc2.getElementsByTagName("row");
for (var i=0, l=rows.length; i<l; i++) {
    var row = rows[i];
    var cs = row.getElementsByTagName("c");
    for (var j=0, m=cs.length; j<m; j++) {
        var c = cs[j];
        var t = c.getAttribute("t");
        var v = c.getElementsByTagName("v")[0]; // throws an error if there is no "v"

        // do whatever you want with row, c, t and v
    }
}

由于您在上面的示例中未使用row,因此可能只省略外部循环并使用

var cs = xmlDoc2.getElementsByTagName("c");