Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript解析XML字符串_Javascript - Fatal编程技术网

使用javascript解析XML字符串

使用javascript解析XML字符串,javascript,Javascript,大家好,我在解析xml字符串时经历了一段痛苦的时光。绳子看起来像这样 <sheetData> <row r="1" spans="1:12" x14ac:dyDescent="0.25"> <c r="A1"> <v>1</v> </c>

大家好,我在解析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>
所以这里是我的基本问题,什么是将所有子节点置于“行”下的最简单方法?另外,我想做一个决定,如果子节点的属性为“T” 我想将该值指定给另一个对象变量。 如蒙答复,将不胜感激。
我真的很想用普通的老JavaScript来实现这一点,并且更愿意远离任何库。

您确定您的
xmlDoc2.getElementsByTagName(“行”)
至少有一个结果吗?否则,语法似乎很好

另外,您的脚本片段中缺少很多初始化,没有这些,我们将无法帮助您

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

编辑:

要遍历(似乎是正确的词,而不是“解析”)XML文档,您应该自己循环遍历每个节点列表。这是可能的,每个元素都继承节点接口,而不仅仅是xml文档对象——正如您所相信的那样

此外,您不必计算
s,因为您只对
c
s感兴趣。一个很大的错误似乎是通过将一行或多行数与第一行的
c
元素数相乘,从而对(整个)文档中的
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
    }
}

您确定
xmlDoc2.getElementsByTagName(“行”)
至少有一个结果吗?否则,语法似乎很好

另外,您的脚本片段中缺少很多初始化,没有这些,我们将无法帮助您

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

编辑:

要遍历(似乎是正确的词,而不是“解析”)XML文档,您应该自己循环遍历每个节点列表。这是可能的,每个元素都继承节点接口,而不仅仅是xml文档对象——正如您所相信的那样

此外,您不必计算
s,因为您只对
c
s感兴趣。一个很大的错误似乎是通过将一行或多行数与第一行的
c
元素数相乘,从而对(整个)文档中的
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
    }
}

你有没有看过相关的问题?我可以在javascript中看到almos半打与xml解析相关的问题。正如我在问题中所说的,我看了又看,但我就是找不到任何有用的东西,这就是我发布的原因。在我看来,读取XML文件和读取XML字符串是完全不同的概念,谢谢你的评论。请重命名你的问题,因为你的问题似乎不是“如何解析XML”,我不明白为什么?我正在使用JavaScript解析XML,而不是服务器端语言?我为什么要重命名这个问题?您的变量XMLDoc2似乎包含一个已经解析过的XML文档,不是吗?您看过相关的问题了吗?我可以在javascript中看到almos半打与xml解析相关的问题。正如我在问题中所说的,我看了又看,但我就是找不到任何有用的东西,这就是我发布的原因。在我看来,读取XML文件和读取XML字符串是完全不同的概念,谢谢你的评论。请重命名你的问题,因为你的问题似乎不是“如何解析XML”,我不明白为什么?我正在使用JavaScript解析XML,而不是服务器端语言?我为什么要重命名这个问题?您的变量XMLDoc2似乎包含一个已解析的XML文档,不是吗?XMLDoc2.getElementsByTagName(“行”)它绝对有值。我的问题是,当我遇到一个父元素(比如row)时,我想读取row下的子元素。在我看来,我不需要这样做“var len=xmlDoc2.getElementsByTagName(“行”)[0].childNodes.length”。我认为有一种更好的方法可以识别父节点并循环子节点。Total sheet nodes是xml文件中的行节点总数。我想我应该在这里放一个片段,这样就不会让任何人被大量的代码淹没。“TypeError:xmlDoc2.getElementsByTagName(“c”)[I]未定义”这是我得到的错误。我尝试完成任务的方式的问题是,由于我将总节点数乘以子节点数,因此在第一次尝试读取15个子节点时,父行节点只有5个子节点。和第二个父节点的唯一两个子节点。这些有意义吗?我需要识别每一位家长,然后只解析这是我失败的孩子。是的,我有你的错误(见我的编辑)。您的错误显然不是来自
var len=xmlDoc2.get…
-line。感谢您回答我的问题这就是我想要完成的,我只是因为一个以上的原因无法完成。我稍微修改了您的代码,似乎这一行“for(var j=0;m=cs.length;jxmlDoc2.getElementsByTagName(“行”),它绝对有值。我的问题是,当我遇到一个父元素(如row)时,我想读取row下的子元素。在我看来,我不应该这样做”var len=xmlDoc2.getElementsByTagName(“row”)[0].childNodes.length”。我认为有一种更好的方法,可以只标识父节点并循环子节点。Total sheet nodes是xml f中的总行节点
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
    }
}
var cs = xmlDoc2.getElementsByTagName("c");