使用子子节点解析xml

时间:2013-03-05 07:32:45

标签: xml xml-parsing

早上好。

我有下一个带子子的xml文件,我想读取它们以将数据填充到表中。现在,我知道如何以简单的方式使用子节点,但我真的不知道如何实现它来获取子子节点。

<Result>
<Record id="000231">
<AC_NPD/>
<Name>Company1</Name>
<AC_CPR>00003</AC_CPR>
<AC_ALM>00</AC_ALM>
<AC_FEC>12/01/2007</AC_FEC>
<AC_LNA ncols="6">
   <Row>
      <Column>000084</Column>
      <Column>1.230</Column>
      <Column/>
      <Column/>
      <Column/>
      <Column/>
   </Row>
</AC_LNA>
<AC_FSE>12/01/2007</AC_FSE>
<AC_AV/>
<AC_UFH ncols="3"/>
</Record>
</Result>

现在,我使用此脚本绘制包含结果的表:

 <script>
 if (window.XMLHttpRequest)
 {// code for IE7+, Firefox, Chrome, Opera, Safari
 xmlhttp=new XMLHttpRequest();
  }
else
 {// code for IE6, IE5
 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }

 xmlhttp.open("GET","xml/pruebas/resp2.asp",false);
 xmlhttp.send();
 xmlDoc=xmlhttp.responseXML; 


 document.write("<table class='table table-striped table-condensed table-bordered'  id='example'>");
document.write("<thead>");
    document.write("<tr class='odd gradeX'>");
  document.write("<th>Sale</th>");
    document.write("<th>Name</th>");
    document.write("<th>Date</th>");
    document.write("<th>Date Sale</th>");
    document.write("<th>Item</th>");
    document.write("<th>Quantity</th>");
    document.write("<th class='hidden-phone'>Price</th>");
    document.write("<th class='hidden-phone'>Total</th>");
    document.write("<th>Sale Item</th>");
    document.write("<th>Button</th>");
   document.write("</tr>");
   document.write(" </thead>");
var x=xmlDoc.getElementsByTagName("Record");

for (i=0;i<x.length;i++)
 { 


 document.write("<tr>");
 document.write("<td>");  document.write("</td>");
 document.write("<td>");  document.write(x[i].getElementsByTagName("Name")[0].childNodes[0].nodeValue);  document.write("</td>");
 document.write("<td>");  document.write(x[i].getElementsByTagName("AC_FEC")[0].childNodes[0].nodeValue);  document.write("</td>");
 document.write("<td>");  document.write(x[i].getElementsByTagName("AC_FSE")[0].childNodes[0].nodeValue);  document.write("</td>");
 document.write("<td>"); document.write(x[i].getElementsByTagName("AC_LNA")[0].childNodes[0].nodeValue);   document.write("</td>");
 document.write("<td>");   document.write("</td>");
 document.write("<td>");   document.write("</td>");
 document.write("<td>");   document.write("</td>");
 document.write("<td>");  document.write("</td>");


document.write("<td> <a data-toggle='modal' class='btn' href='sale.asp?&number=");     document.write(x[i].getElementsByTagName("AC_FEC")[0].childNodes[0].nodeValue);    document.write("' data-target='#myModal'>  My Sale  </a> ");                document.write("   </td>");

 document.write("</tr>");
 }
document.write("</table>");
</script>

所以,如果有人知道如何获得子子节点,我将非常感激。

最好的问候。

1 个答案:

答案 0 :(得分:0)

首先,请注意您的XML无效:

  1. 一些&lt; Column&gt;标签以&lt; Columna&gt;。
  2. 结束
  3. &LT; AC_LNA&GT;标签未正确关闭。
  4. 修复此问题后,我建议,在您的情况下,这是一个选项,使用XSLT表将XML与您的演示文稿分开。请注意,使用XSLT不是唯一的选择,这只是我的建议。

    如果您不想使用XSLT,您总是可以使用示例来访问子子节点:

    var columns = x[i].getElementsByTagName('Column');
    for ( var ci = 0; ci < columns.length; ci++ ) {
      // do something with columns[ci]
    }
    

    如果您选择使用XSLT,那么谷歌有一个名为AJAXSLT的好图书馆。您可以使用它将您从服务器获取的XML转换为HTML。

    您的样式表看起来像这样(部分响应):

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
      <table>
        <xsl:for-each select="Result/Record">
        <tr>
          <td><xsl:value-of select="Name"/></td>
          <td><xsl:value-of select="AC_CPR"/></td>
          <td>
            Columns: 
            <xsl:for-each select="AC_LNA/Row/Column[text() != '']">
              <xsl:value-of select="." />, 
            </xsl:for-each>
          </td>
        </tr>
        </xsl:for-each>
      </table>
    </xsl:template>
    </xsl:stylesheet>
    

    上面的代码创建了来表(为简单起见没有&lt; thead&gt;)并获得&lt; Record&gt; name,AC_CPR和每个Row / Column值。您可以轻松扩展它以检索更多信息。