【问题标题】:Trying to parse XML and create a List information using Linq and C#尝试使用 Linq 和 C# 解析 XML 并创建列表信息
【发布时间】:2015-06-23 17:51:03
【问题描述】:

对 C# 和 Linq 非常陌生,要学习很多东西...我希望能够使用 Linq 解析 XML,并将部分 XML 数据移动到列表中。 XML 数据很小,最初(下面的查询 1)我能够捕获除 ACCT 节点之外的所有节点。我的第二次尝试是创建第二个查询(下面的 ACCT 查询),但它仅成功捕获了 ACCT 的第一次出现。搜索了一段时间,找到了几个例子,但我没有成功地实现用 Linq 和 c# 捕获所有 ACCT 出现的方法。似乎是一个非常有用的工具,任何帮助将不胜感激。

这里是 XML

<?xml version="1.0" encoding="utf-8"?>
<ORDER>
  <EMPNUMBER>LDC</EMPNUMBER>
  <ITEMNAME>NEWNAME_GR0045LDS01.JPG</ITEMNAME>
  <DATETIMESTAMP>04-19-2015</DATETIMESTAMP>
  <DEPT>HMES</DEPT>
<SHIPMENTLIST>
  <ACCT>2222222222</ACCT>
  <ACCT>1111111111</ACCT>
</SHIPMENTLIST>
</ORDER>

这是当前课程

public class clsShipACCT
{

    public string strShipACCT
    {
        get;
        set;
    }
}

这里是逻辑(注释掉的项目显示失败的尝试列表)

//this gets all xml details except account(ACCT)
           var query1 = from item in xDoc.Descendants("ORDER")   // xDoc.Elements() //xDoc.Descendants("ORDER") // xDoc.Root.Elements("ORDER")
                        select new
                        {
                            EmpNum = item.Element("EMPNUMBER").Value,
                            ItemName = item.Element("ITEMNAME").Value,
                            OrderDate = Convert.ToDateTime(item.Element("DATETIMESTAMP").Value),

                        };


//attempt to get ACCT detail
            var Acctlist = from P in xDoc.Root.Descendants("SHIPMENTLIST")
                         select new { b = P.Element("ACCT").Value };


            foreach(var p in ACCTlist)
                ACCTgram.WriteLog("Parsed XML Acct: " + p);


//failed attempt to capture ACCT in list: 
//           List<clShipACCT> testList = ACCTlist.ToList<clShipACCT>(); 

            //////var ACCTlist = (from P in xDoc.Descendants("SHIPMENTLIST")
            //////               select new clShipACCT { strShipACCT = childitem.Element("ACCT").Value }).ToList();
            //////testShipACCTList.AddRange(ACCTlist);

【问题讨论】:

  • 要做的第一件事:删除 clsstr 前缀,并开始遵循 .NET 命名约定(例如,ShipmentAccount 会是一个更好的名称。)目前尚不完全清楚为什么你有一个完整的班级来包装一个字符串......
  • 会的,谢谢您的反馈。

标签: c# xml linq list


【解决方案1】:

使用.Elements 方法 - 此方法返回具有给定名称的所有元素
.Element 方法将仅返回第一个元素

var shipments = xDoc.Root.Descendants("SHIPMENTLIST")

List<String> acctList = new List<String>();
foreach(var accts in shipments)
{
    acctList.AddRange(accts.Elements("ACCT").Select(acct => acct.Value));
}

foreach(string acct in acctlist)
    ACCTgram.WriteLog("Parsed XML Acct: " + acct);

【讨论】:

  • 谢谢!将 Element 更改为 Elements,现在返回所有数据。你让我今天一整天都感觉很好!!感谢您的时间。
【解决方案2】:
var result = xDoc.Root.Element("SHIPMENTLIST").Elements("ACCT").Select(x => x.Value).ToList();

使用帖子中的xml,这应该会产生一个

List<string> 

ACCT 字段中的值。

【讨论】:

  • 谢谢。将 Element 更改为 Elements,并且只能组合为一个查询,并且可以与返回的 List 一起使用。感谢您的宝贵时间。
【解决方案3】:

您非常接近,只需将您的帐户搜索添加到您的第一个查询和通用对象创建中。

将其更改为:

var query1 = from item in xDoc.Descendants("ORDER")   // xDoc.Elements() //xDoc.Descendants("ORDER") // xDoc.Root.Elements("ORDER")
select new
{
    EmpNum = item.Element("EMPNUMBER").Value,
    ItemName = item.Element("ITEMNAME").Value,
    OrderDate = Convert.ToDateTime(item.Element("DATETIMESTAMP").Value),
    Accts = item.Element("SHIPMENTLIST").Elements("ACCT").Select(x => x.Value).ToList()
};

【讨论】:

  • 谢谢。我将 Element 更改为 Elements,然后能够将其组合到一个查询中,并且列表信息返回精美。谢谢你的时间!! (以及我需要的积极反馈:)
【解决方案4】:

//这适用于 LinqPad...Elements() 返回多个实例...

void Main()
{
    XDocument doc= XDocument.Load(@"d:\test2.xml");
    var orders = doc.Root.Elements("ORDER")
        .Select (o => new Order
            {
                EmpNumber=o.Element("EMPNUMBER").Value,
                ItemName=o.Element("ITEMNAME").Value,
                TimeStamp=o.Element("DATETIMESTAMP").Value,
                Shipments=o.Element("SHIPMENTLIST").Elements("ACCT").Select (e => new Shipment{Account= e.Value}).ToList()
            }
        );

    orders.Dump();  
}



class Order
{
    public Order ()
    {
        this.Shipments=new List<Shipment>();
    }
    public string EmpNumber { get; set; }
    public string ItemName { get; set; }
    public string TimeStamp { get; set; }  //should be date time
    public string Department { get; set; }
    public List<Shipment> Shipments { get; set; }
}


class Shipment
{
    public string Account { get; set; }
}

我假设以下 xml:添加 ORDERS 作为根元素,因为 xml 中的一个订单真的很简单......

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多