【问题标题】:Parse xml data-table to dataset将 xml 数据表解析为数据集
【发布时间】:2014-12-18 05:00:16
【问题描述】:

我正在编写一个网页,该网页需要解析从 API 调用派生的 XML 中的数据,但 XML 被格式化为数据头、数据体类型的模式。

我需要能够为 ASP.net C# 页面解析此内容,我将在其中将数据导入 SQL Server 表...任何帮助将不胜感激!

有问题的 XML 是:

<?xml version="1.0" encoding="UTF-8"?>
<report>
    <head>
        <vars>
            <var name="userId">selfservice</var>
            <var name="networkId">607</var>
            <var name="reportName">Advertiser Channel Report</var>
        </vars>
    </head>
    <body>
        <component name="">
            <component-header>Data</component-header>
            <component-body>
                <table name="">
                    <table-header/>
                    <table-body>
                        <overview>
                            <overview_item property="Execution time:">
                                0.000  second(s)
                            </overview_item>
                            <overview_item entity="Days stat" property="Days stat:">10/21/2014 - 10/21/2014</overview_item>
                            <overview_item entity="Advertiser" property="Advertiser Name:"> Like _SS</overview_item>
                        </overview>
                        <data>
                            <data-header>
                                <dr>
                                    <dv type="int">Sr. No.</dv>
                                    <dv type="int">Advertiser ID</dv>
                                    <dv type="string">Advertiser Name</dv>
                                    <dv type="int">Channel ID</dv>
                                    <dv type="string">Channel Name</dv>
                                    <dv type="long">Channel Impressions</dv>
                                    <dv type="timestamp">Daily</dv>
                                    <dv type="long">Days stat Impressions</dv>
                                </dr>
                            </data-header>
                            <data-body>
                                <dr class="total">
                                    <dv>46 row(s) total</dv>
                                    <dv/>
                                    <dv/>
                                    <dv/>
                                    <dv/>
                                    <dv>1073</dv>
                                    <dv/>
                                    <dv>1073</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">1</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">22923</dv>
                                    <dv t="s">CS2261</dv>
                                    <dv t="ns">1</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">1</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">2</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">22683</dv>
                                    <dv t="s">CS2258</dv>
                                    <dv t="ns">1</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">1</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">3</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">12174</dv>
                                    <dv t="s">CR5925</dv>
                                    <dv t="ns">2</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">2</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">4</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">26519</dv>
                                    <dv t="s">CS2938</dv>
                                    <dv t="ns">65</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">65</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">5</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">22776</dv>
                                    <dv t="s">CS2261</dv>
                                    <dv t="ns">19</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">19</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">6</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">2748</dv>
                                    <dv t="s">CN4940</dv>
                                    <dv t="ns">7</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">7</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">7</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">4235</dv>
                                    <dv t="s">CN3539</dv>
                                    <dv t="ns">1</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">1</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">8</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">25387</dv>
                                    <dv t="s">CS264</dv>
                                    <dv t="ns">3</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">3</dv>
                                </dr>
                                <dr>
                                    <dv t="ns">9</dv>
                                    <dv t="ns">596749</dv>
                                    <dv t="s">DATest3_SS</dv>
                                    <dv t="ns">22779</dv>
                                    <dv t="s">CS2261</dv>
                                    <dv t="ns">3</dv>
                                    <dv t="ns">10/21/2014</dv>
                                    <dv t="ns">3</dv>
                                </dr>
                                <dr class="total">
                                    <dv>46 row(s) total</dv>
                                    <dv/>
                                    <dv/>
                                    <dv/>
                                    <dv/>
                                    <dv>1073</dv>
                                    <dv/>
                                    <dv>1073</dv>
                                </dr>
                            </data-body>
                            <data-footer/>
                        </data>
                    </table-body>
                </table>
            </component-body>
        </component>
    </body>
</report>

【问题讨论】:

    标签: c# asp.net xml parsing datatable


    【解决方案1】:

    如果您的目标是在 HTML 页面中显示此 XML,您可以使用 XSLT 将 XML 转换为 HTML。 这就是 Windows Live Messenger 用于对话日志和 IIS 用于跟踪日志的内容。

    使用转换指令创建 XSLT 后,您只需在 XML 中添加对 XSLT 的引用,当您在浏览器中打开 XML 时,奇迹就会发生。

    查看此示例:http://www.w3schools.com/xml/xml_xsl.asp

    【讨论】:

    • 我的目标是将其转换为 DataTable,或者我可以导入到 SQL Server 数据库表中的某种格式。
    【解决方案2】:

    您可以使用 Linq-to-XML 或 XPath 解析 xml,然后使用 Entity Framework(或直接 ADO.NET)将其插入数据库。

    【讨论】:

    • 这个答案不完整。也许如果你展示了怎么做?
    • 我相信这个答案是正确的。只需查找 linq-to-xml,您就会发现很多关于如何将 xml 转换为对象的示例。获得对象后,您可以使用自己喜欢的数据访问框架将其保存到数据库中
    【解决方案3】:

    我可以用这个函数解决这个问题:

    public DataTable parseReport(List<zapi.ClientReportResultItem> reportItems)
    {
        StringBuilder sb = new StringBuilder();
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(reportItems[0].body);
        StringReader sReader = new StringReader(xmlDoc.InnerXml);
        System.Xml.Linq.XDocument d = System.Xml.Linq.XDocument.Load(sReader);
        List<_headers> headers = new List<_headers>();
        _headers header = new _headers();
    
        var headerXml = from r in d.Descendants("data-header")
                     .Descendants("dr")
                     .Descendants("dv")
                     select new
                     {
                         dv = r.Value,
                         dv_type = r.Attribute("type").Value
                     };
        foreach (var _val in headerXml)
        {
            header = new _headers();
            header.name = _val.dv;
            header.type = _val.dv_type;
            headers.Add(header);
        }
    
        //Create Data Table
        DataTable reportData = new DataTable();
        foreach (var head in headers)
        {
            if (head.type == "timestamp")
                reportData.Columns.Add(head.name, typeof(DateTime));
            else if (head.type == "int")
                reportData.Columns.Add(head.name, typeof(int));
            else if (head.type == "string")
                reportData.Columns.Add(head.name, typeof(string));
            else if (head.type == "float")
                reportData.Columns.Add(head.name, typeof(float));
            else if (head.type == "long")
                reportData.Columns.Add(head.name, typeof(long));
        }
    
        var data = from r in d.Descendants("data-body")
                   .Descendants("dr")
                   where r.HasAttributes == false
                   select new
                   {
                       dv = r.Elements()
                   };
    
        foreach (var datavalue in data)
        {
            DataRow dr = reportData.NewRow();
            for (int iCount = 0; iCount < datavalue.dv.Count(); iCount++)
            {
                dr[iCount] = datavalue.dv.ToArray()[iCount].Value;
            }
            reportData.Rows.Add(dr);
        }
    
        return reportData;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2015-06-30
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2012-04-10
      • 2019-08-17
      相关资源
      最近更新 更多