使用 C# 查询存储在属性中的 XML 值并导入数据集

Posted

技术标签:

【中文标题】使用 C# 查询存储在属性中的 XML 值并导入数据集【英文标题】:Query XML values stored in attributes & import into dataset using C# 【发布时间】:2019-09-16 04:12:41 【问题描述】:

我是 C# 的新手,并且是解析 xml 的新手。我有一个从 Web 服务获取的 xml 流,它具有我想使用数据集/数据表加载到我的 SQL Server 中的属性值。我很难在我想要导入 SQL 的结构中获取数据。

我想提取数据(将每个数据放入以下结构的表中:

列:bounce_date cancel_mailing_instance_id cancel_message cancel_date email 等

行:bounce_date "value"cancellation_mailing_instance_id "value"cancellation_message "value"cancellation_date "value" email "value"等

到目前为止,我所能完成的就是将所有数据放入行中。我想根据等创建列标题

...以及基于“价值”“价值”等的行。

我的 XML 如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<GridResponse xmlns="http://sample.sample.net/aapi/2009/08/">
<Brand id="12345">ACME</Brand>
<User>asample</User>
<Grids>
<Grid type="subscriber">
<Record row="1">
<Fields>
<Field element="bounce_date"/>
<Field element="cancellation_mailing_instance_id"/>
<Field element="cancellation_message"/>
<Field element="cancellation_date">2018-03-21T16:00:25.7670000Z</Field>
<Field element="email"/>
<Field element="is_repeated_bouncer">0</Field>
<Field element="is_unsubscriber">1</Field>
<Field element="modified_date">2018-03-21T16:00:29.6500000Z</Field>
<Field element="service_since_date">2018-03-21T13:45:50.2800000Z</Field>
<Field element="user_id"/>
<Field element="subscriber_upload_id"/>
<Field element="imis_name_id"/>
</Fields>
</Record>
<Record row="2">
<Fields>
<Field element="bounce_date"/>
<Field element="cancellation_mailing_instance_id"/>
<Field element="cancellation_message"/>
<Field element="cancellation_date"/>
<Field element="email">xxxxx@sample.org</Field>
<Field element="is_repeated_bouncer">0</Field>
<Field element="is_unsubscriber">0</Field>
<Field element="modified_date">2018-03-21T14:07:32.1530000Z</Field>
<Field element="service_since_date">2018-03-21T14:07:32.1530000Z</Field>
<Field element="user_id"/>
<Field element="subscriber_upload_id"/>
<Field element="imis_name_id"/>
</Fields>
</Record>
<Record row="3">
<Fields>
<Field element="bounce_date"/>
<Field element="cancellation_mailing_instance_id"/>
<Field element="cancellation_message"/>
<Field element="cancellation_date"/>
<Field element="email">xxxxx2@sample.org</Field>
<Field element="is_repeated_bouncer">0</Field>
<Field element="is_unsubscriber">0</Field>
<Field element="modified_date">2019-04-22T20:03:33.9700000Z</Field>
<Field element="service_since_date">2019-04-22T20:03:33.9700000Z</Field>
<Field element="user_id"/>
<Field element="subscriber_upload_id"/>
<Field element="imis_name_id"/>
</Fields>
</Record>
</Grid>
</Grids>
</GridResponse>

到目前为止,我正在尝试使用 Linq To XML。如果有人可以提供一些代码示例来帮助我入门,我将永远感激不尽!提前致谢。

【问题讨论】:

【参考方案1】:

他是一些真正简单的 Xml Linq,可以将结果读入字典

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication110

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            string xml = File.ReadAllText(FILENAME);
            XDocument doc = XDocument.Parse(xml);
            XElement root = doc.Root;
            XNamespace ns = root.GetDefaultNamespace();

            Dictionary<int, List<string>> results = doc.Descendants(ns + "Record")
                .GroupBy(x => (int)x.Attribute("row"), y => y)
                .ToDictionary(x => x.Key, y => y.Descendants(ns + "Field").Select(z => (string)z.Attribute("element")).ToList());
        
    

【讨论】:

谢谢jdweng!这很有帮助。如果您不介意我正在尝试查看列表的内容。我只能获取行和字段,但无法查看字段值“z”。我正在执行以下操作: foreach (var x in results) Console.WriteLine(x.Key); foreach (var y in x.Value) Console.WriteLine(y); 我得到以下的结果:1 bounce_date cancellation_mailing_instance_id cancellation_message CANCELLATION_DATE电子邮件is_repeated_bouncer is_unsubscriber MODIFIED_DATE service_since_date USER_ID subscriber_upload_id imis_name_id 2 bounce_date cancellation_mailing_instance_id cancellation_message CANCELLATION_DATE电子邮件is_repeated_bouncer is_unsubscriber MODIFIED_DATE service_since_date USER_ID subscriber_upload_id imis_name_id 跨度>

以上是关于使用 C# 查询存储在属性中的 XML 值并导入数据集的主要内容,如果未能解决你的问题,请参考以下文章

c#中xml文件

XSLT - 如何仅输出属性值并忽略元素的值

请问如何从数据库中读取一个存储过程并把查询结果生成一个xml文件(c#)

C#如何检索存储在BLOB中的XML,然后更新它并存储

如何在一个 SQL 查询中检索值并在存储过程中使用它?

C# XML 解析问题