【发布时间】:2020-07-10 22:15:15
【问题描述】:
我是 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中生成行号。
现在剩下的就是如何从“响应”中获取数据,我需要“总计”和“页面”
如果我在这里偏离了轨道,也请告诉我,并且可以采取不同的方式
【问题讨论】:
-
对于复杂的 xml 文件,ReadXml 将提供无用的破碎数据。无法重新组合数据以使其有意义。