【问题标题】:How to create a multidimensional array table from XML?如何从 XML 创建多维数组表?
【发布时间】:2018-03-10 07:43:59
【问题描述】:

我正在尝试从 XML 创建一个二维数组并将其呈现到 HTML 页面中, 正如您在第一张图片中看到的,我设法从 XML 文件中提取数据。但表值是重复的。我该如何避免呢?任何建议都有帮助。谢谢

for (var y = 0; y < 10; y++) {
    table_summary += "<tr><td style='color:blue'>" + s[y].getElementsByTagName("_portfolioName")[0].childNodes[0].nodeValue + "</td></tr>";

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

        table_summary += "<th></th><th style='color:orangered'>" + x[i].getElementsByTagName("_date")[0].childNodes[0].nodeValue + "</th>";
        var row = x[i];

        var MtmBefore = row.getElementsByTagName("MtmBefore")[0].childNodes[0].nodeValue;
        var MtmAfter = row.getElementsByTagName("MtmAfter")[0].childNodes[0].nodeValue;
        var ChangeMaturingTrades = row.getElementsByTagName("ChangeMaturingTrades")[0].childNodes[0].nodeValue;
        var ChangeNewTrades = row.getElementsByTagName("ChangeNewTrades")[0].childNodes[0].nodeValue;
        var ChangeCashflow = row.getElementsByTagName("ChangeCashflow")[0].childNodes[0].nodeValue;
        var ChangeTheta = row.getElementsByTagName("ChangeTheta")[0].childNodes[0].nodeValue;
        var ChangePosition = row.getElementsByTagName("ChangePosition")[0].childNodes[0].nodeValue;
        var ChangeMarket = row.getElementsByTagName("ChangeMarket")[0].childNodes[0].nodeValue;
        var ChangeOther = row.getElementsByTagName("ChangeOther")[0].childNodes[0].nodeValue;

        table_summary += "<tr><th>Mtm Before</th><td>" + MtmBefore + "</td></tr>" +
            "<th>Mtm After</th><td>" + MtmAfter + "</td></tr>" +
            "<th>Change Maturing Trades</th><td>" + ChangeMaturingTrades + "</td></tr>" +
            "</th><th>Change New Trades</th><td>" + ChangeNewTrades.slice(0, (ChangeNewTrades.indexOf(".")) + 3) + "</td></tr>" +
            "<tr><th>Change Cashflow</th><td>" + ChangeCashflow + "</td></tr>" +
            "<tr><th>Change Theta</th><td>" + ChangeTheta.slice(0, (ChangeTheta.indexOf(".")) + 3) + "</td></tr>" +
            "<tr><th>Change Position</th><td>" + ChangePosition.slice(0, (ChangePosition.indexOf(".")) + 3) + "</td></tr>" +
            "<tr><th>Change Market</th><td>" + ChangeMarket.slice(0, (ChangeMarket.indexOf(".")) + 3) + "</td></tr>" +
            "<tr><th>Change Other</th><td>" + ChangeOther.slice(0, (ChangeOther.indexOf(".")) + 3) + "</td></tr>";


        }
    }

XML file

我想要达到的目标

【问题讨论】:

    标签: javascript ajax xml


    【解决方案1】:

    我从这个答案https://stackoverflow.com/a/8412989/2768318 中获取了解析 xml 字符串的最佳实践。

    这是一个 JQUERY 方法,可以轻松地从 XML 构建 javascript 对象。
    这是您的 XML 格式:https://pastebin.com/yySDn4QT(缺少几个标签)。

    这是我构建的 jfiddle:https://jsfiddle.net/rhneLsgL/ (更新:https://jsfiddle.net/rhneLsgL/1/

    var xml = $.parseXML("<ExtractSumm....");
    // ....
    $("#btn1").click(function(){
        $("#test1").text(function(i, origText){
            //debugger;
            return xml.documentElement;
        });
    });
    

    documentElement 是一个 javascript 对象,具有所有有用的功能来粘贴 XML,例如:您可以访问子元素、文本、知道列表有多长、每种类型有多少元素等等。

    从这里开始,您可以轻松构建表格,而无需使用 for each 循环。


    编辑 一个例子在这个小提琴中:https://jsfiddle.net/rhneLsgL/5/ 我将实现分为两部分:
    1. 根据需要从现有 XML 中提取数据
    2. 写表格。

    我发誓这张桌子是你需要的形式。


    Edit2:我已将此解决方案添加到我的个人 Js Fiddle 帐户中,以免丢失:https://jsfiddle.net/GaetanoPiazzolla/u40g8whx/

    【讨论】:

    • 感谢您的回复,我可以将它们作为数组,正如您在骨架图像上看到的那样,对于每个 profileName 获取日期和属性的数组。所以当我使用 for 循环 x[i][j] 时,我无法进一步深入研究数据。
    • 我得到了 HTML 格式的文件,如图所示,但我不能使它形成上面的示例表?(我想要实现的目标)
    • 我已经更新了我的小提琴,只需要编辑答案。
    • 这太棒了,我只是想知道 parserXML 是否允许 URL 数据链接?
    • 我无法将 XML 作为 URL 传递...有什么办法吗?
    【解决方案2】:

    考虑XSLT,这是一种专用语言,旨在将 XML 文件转换为其他 XML、HTML,甚至 CSV/TXT 格式。特别是使用Muenchian Grouping,您可以通过索引&lt;_detail&gt; 的每个子节点的元素名称来将数据透视到您的“2D”需求,因为它们将成为每个html 表的行。

    Javascript can run XSLT 与大多数通用语言(Java、C#、Perl、PHP、Python、VB)一样,或者您可以将其作为 XML 中的处理指令调用,以通过浏览器呈现为 HTML:

    <?xml-stylesheet type="text/xsl" href="myxsl.xsl"?>
    

    虽然您发布的 XML 示例与您的尝试显示的不完全一样,但下面使用的发布示例可能适用于您的实际源 XML。

    XSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output indent="yes" method="html"/>
      <xsl:strip-space elements="*"/>
    
      <xsl:key name="elemid" match="_detail/*[local-name()!='alerts' and local-name()!='attributionResults']" use="local-name()" />
    
      <xsl:template match="/DecompExtractSummary">
        <html>
            <body>
                <table>
                    <xsl:apply-templates select="_dateSets"/>
                </table>
            </body>
        </html>
      </xsl:template>
    
       <xsl:template match="_dateSets|DecompExtractSummaryDateSet">
            <xsl:apply-templates select="DecompExtractSummaryDateSet|_portfolioSummaries"/>
        </xsl:template>   
    
       <xsl:template match="_portfolioSummaries">
            <xsl:apply-templates select="DecompExtractSummaryDateSetDetail"/>
        </xsl:template>   
    
       <xsl:template match="DecompExtractSummaryDateSetDetail">
            <xsl:apply-templates select="_detail/*[generate-id() = generate-id(key('elemid', local-name()))]"/>
        </xsl:template>     
    
      <xsl:template match="_detail/*[local-name()!='alerts' and local-name()!='attributionResults']"> 
        <tr>
            <td><xsl:value-of select="local-name()"/></td>
            <xsl:for-each select="key('elemid', local-name())">         
                <td><xsl:value-of select="."/></td>
            </xsl:for-each>         
        </tr>
      </xsl:template>
    
    </xsl:stylesheet>
    

    HTML

    <html><body><table>
    <tr>
    <td>calcDate1</td>
    <td>2017-09-19T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>2017-09-19T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    </tr>
    <tr>
    <td>calcDate2</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-20T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-21T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-22T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>0001-01-01T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    <td>2017-09-25T00:00:00</td>
    </tr>
    <tr>
    <td>currency</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    <td>USD</td>
    </tr>
    <tr>
    <td>exchangeRate</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>0</td>
    <td>1</td>
    <td>0</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>0</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>0</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>0</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    </tr>
    <tr>
    <td>MtmBefore</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-23.3</td>
    <td>-4.5</td>
    <td>-2.4</td>
    <td>0</td>
    <td>3.3</td>
    <td>0</td>
    <td>1199.22</td>
    <td>-99.1</td>
    <td>-22.22</td>
    <td>-99.22</td>
    <td>-22330.22</td>
    <td>-3</td>
    <td>-970</td>
    <td>-22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-23</td>
    <td>-1018</td>
    <td>-45</td>
    <td>-790</td>
    <td>-44</td>
    <td>-834</td>
    <td>0</td>
    <td>-1050</td>
    <td>0</td>
    <td>-105</td>
    <td>-2.9</td>
    <td>-84</td>
    <td>-2</td>
    </tr>
    <tr>
    <td>MtmAfter</td>
    <td>-12.23</td>
    <td>-4.23</td>
    <td>-45.56</td>
    <td>0</td>
    <td>23.23</td>
    <td>0</td>
    <td>23.2</td>
    <td>-23.23</td>
    <td>-23.23</td>
    <td>-23.23</td>
    <td>-34.34</td>
    <td>-3.2</td>
    <td>-4.33</td>
    <td>-224.22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-231.3</td>
    <td>-22.3</td>
    <td>-22.22</td>
    <td>-22.3</td>
    <td>-44.3</td>
    <td>-8630</td>
    <td>0</td>
    <td>-105</td>
    <td>0</td>
    <td>-105</td>
    <td>-264.9</td>
    <td>-8804</td>
    <td>-26.9</td>
    <td>-36089</td>
    <td>-4030</td>
    <td>-7643</td>
    <td>-78</td>
    <td>650</td>
    <td>0</td>
    <td>65</td>
    <td>0</td>
    <td>-765</td>
    <td>-7</td>
    </tr>
    <tr>
    <td>ChangeMaturingTrades</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>2.4</td>
    <td>12.22</td>
    <td>0</td>
    <td>3.22</td>
    <td>0</td>
    <td>22.22</td>
    <td>-99.3</td>
    <td>22.3</td>
    <td>-22.22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-23</td>
    <td>-456</td>
    <td>-45</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-29</td>
    <td>-264.9</td>
    <td>-2</td>
    </tr>
    <tr>
    <td>ChangeNewTrades</td>
    <td>-23.23</td>
    <td>-23.232</td>
    <td>-34.35</td>
    <td>0</td>
    <td>23.23</td>
    <td>0</td>
    <td>23.23</td>
    <td>-23.23</td>
    <td>-232.23</td>
    <td>-23.23</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-224.22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-231.4</td>
    <td>-456.22</td>
    <td>-22.22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-105</td>
    <td>0</td>
    <td>-105</td>
    <td>-264.9</td>
    <td>-131</td>
    <td>-64.9</td>
    <td>900</td>
    <td>0</td>
    <td>900</td>
    <td>-78</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>82</td>
    <td>-7</td>
    </tr>
    <tr>
    <td>ChangeCashflow</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    </tr>
    <tr>
    <td>ChangeTheta</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-3.34</td>
    <td>388.1</td>
    <td>-33.22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-26.22</td>
    <td>0</td>
    <td>-101.2</td>
    <td>-224.3</td>
    <td>-325</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-32</td>
    <td>0</td>
    <td>65</td>
    <td>-67</td>
    <td>-1</td>
    <td>0</td>
    <td>32.876712328757662</td>
    <td>0</td>
    <td>32</td>
    <td>0</td>
    <td>18</td>
    <td>0</td>
    </tr>
    <tr>
    <td>ChangePosition</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    </tr>
    <tr>
    <td>ChangeMarket</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-3.3</td>
    <td>22.3</td>
    <td>-3.22</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-5098.22</td>
    <td>0</td>
    <td>-22.2</td>
    <td>2.22</td>
    <td>-7688</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>-7687</td>
    <td>0</td>
    <td>3437</td>
    <td>-3481</td>
    <td>-43</td>
    <td>0</td>
    <td>171</td>
    <td>0</td>
    <td>171</td>
    <td>0</td>
    <td>12</td>
    <td>0</td>
    </tr>
    <tr>
    <td>ChangeOther</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>3.34</td>
    <td>-2.23</td>
    <td>22.3</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>22.22</td>
    <td>0</td>
    <td>-8.22</td>
    <td>22</td>
    <td>21</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>213</td>
    <td>0</td>
    <td>-10</td>
    <td>-46</td>
    <td>-149</td>
    <td>0</td>
    <td>-5</td>
    <td>0</td>
    <td>-5</td>
    <td>0</td>
    <td>-15</td>
    <td>0</td>
    </tr>
    </table></body></html>

    【讨论】:

    • XSLT 可以循环吗?二维?
    • 我在 profileName 中有一个额外的维度或循环。所以我不确定二维表是否足够
    • 您在链接中更新的 XML 格式不正确,因此无效。你有一些双引号卡在打开的节点标签中。
    • 哦,是的,当我删除一些敏感信息时,但基本上就是这样。
    • 查看更新的 XSLT 及其 HTML 输出,当链接的 XML 被删除标签中的双引号时。
    猜你喜欢
    • 2014-12-10
    • 2011-12-14
    • 1970-01-01
    • 2011-07-28
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多