【发布时间】: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);
【问题讨论】:
-
要做的第一件事:删除
cls和str前缀,并开始遵循 .NET 命名约定(例如,ShipmentAccount会是一个更好的名称。)目前尚不完全清楚为什么你有一个完整的班级来包装一个字符串...... -
会的,谢谢您的反馈。