首页 > 解决方案 > 将 xml 数据从 Web API 加载到数据集,然后将关系数据从数据表获取到新数据表

问题描述

我是 C# 开发的新手,第一次在这里发帖,如果我发错地方或听起来很傻,请原谅我

我需要从我设法做到这一点的 Web API 中提取 xml 数据

var request = (HttpWebRequest)WebRequest.Create("webURLhere");
        request.Method = "GET";
        request.ContentType = "application/xml";
        request.Headers.Add("Authorization: Bearer Tokenvalue");
        TextReader reader = new StringReader(newStreamReader(request.GetResponse().GetResponseStream()).ReadToEnd());
        XElement xEle = XElement.Load(reader);

我被困在如何在 StreamReader 中实际利用这些数据上

在放弃使用 Streamreader 之后,我下载了返回的 xml 文件,如下所示

<?xml version="1.0" encoding="utf-8"?>
<response status="ok">
<submissions>
    <submission>
        <id>12345</id>
        <timestamp>2020-06-02 09:20:49</timestamp>
        <user_agent>Mozilla/5.0</user_agent>
        <remote_addr>111.111.111.11</remote_addr>
        <payment_status></payment_status>
        <latitude>321</latitude>
        <longitude>123</longitude>
        <read>1</read>
        <data>
            <XML_Serializer_Tag>
                <field>91388567</field>
                <value>2723</value>
                <flat_value>2723</flat_value>
                <label>URN</label>
                <type>number</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>1</field>
                <value>
                    <XML_Serializer_Tag>disclaimer</XML_Serializer_Tag>
                </value>
                <flat_value>disclaimer</flat_value>
                <label>Checkbox</label>
                <type>checkbox</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>2</field>
                <value>12345</value>
                <flat_value>12345</flat_value>
                <label>ID</label>
                <type>number</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>3</field>
                <value>Name</value>
                <flat_value>Name</flat_value>
                <label>Name</label>
                <type>text</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>4</field>
                <value>email@email.com</value>
                <flat_value>email.email.com</flat_value>
                <label>Email</label>
                <type>email</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>5</field>
                <value>filelink</value>
                <flat_value>filelink</flat_value>
                <label>OL1</label>
                <type>file</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>6</field>
                <value>filelink</value>
                <flat_value>filelink</flat_value>
                <label>DC1</label>
                <type>file</type>
            </XML_Serializer_Tag>
            <XML_Serializer_Tag>
                <field>7</field>
                <value>filelink</value>
                <flat_value>filelink</flat_value>
                <label>DC2</label>
                <type>file</type>
            </XML_Serializer_Tag>
        </data>
    </submission>
</submissions>
<total>1</total>
<pages>1</pages>
<pretty_field_id>4321</pretty_field_id>

我已经设法通过这样做将本地文件中的这个 xml 数据获取到数据集中

DataSet ds = new DataSet();
ds.ReadXml(@"C:\All.XML", XmlReadMode.Auto);

DataSet 可视化工具向我显示数据,我可以通过在调试模式下查看数据集来查看数据集中的关系。我也可以通过这样做单独处理每张桌子

dt1 = ds.Tables[2];

但不能在表之间创建关系。

我需要根据关系从提交、数据和 XML_Serializer_Tag 表中提取数据到一个 datagridview 中,但我今天一整天都无法到达任何地方。请帮忙....

***** 编辑 ********

好的,最终设法做到了。这是我的代码,将其发布在这里是因为我花了很长时间才弄明白,而且无限量的谷歌搜索并没有给我结果。

        var submissions = xEle.Descendants("submission");
        int Srno = 0;
        foreach (var sub in submissions)
        {
            int rowId = dataGridView1.Rows.Add();
            DataGridViewRow row = dataGridView1.Rows[rowId];
            var sub_data = xEle.Descendants("submission").ElementAt(Srno).Descendants("data").Descendants("XML_Serializer_Tag");
            foreach (var SData in sub_data)
            {
                row.Cells["id"].Value = sub.Element("id").Value;
                row.Cells["timestamp"].Value = sub.Element("timestamp").Value;
                row.Cells["Srno"].Value = Srno + 1;
                row.Cells[SData.Element("label").Value].Value = SData.Element("value").Value;
            }
            Srno++;

这会从提交中返回每一行的数据,然后将与提交相关的所有内容从 data.XML_Serializer_Tag 逐行加载到 datagridview 中,使用 Srno 在 datagridview 中生成行号。

现在唯一剩下的是我如何从“响应”中获取数据,我需要“总计”和“页面”

另外请让我知道我是否在这里偏离了轨道并且可以以不同的方式做这件事

标签: c#xml

解决方案


这不会回答您的整个问题,但会帮助您使用来自 WebRequest 的响应流。

TextReader reader = new StringReader( new StreamReader( request.GetResponse().GetResponseStream() ).ReadToEnd() );
DataSet ds = new DataSet();
ds.ReadXml( reader, XmlReadMode.Auto );

或者,您可以尝试:

ds.ReadXml( request.GetResponse().GetResponseStream(), XmlReadMode.Auto );

尽管我更喜欢将事物分开(例如使用 TextReader)以帮助简化可读性和故障排除。


推荐阅读