C# 如何将XML数据加载到数据结构中?
我有以下XML文档C# 如何将XML数据加载到数据结构中?,c#,.net,linq,asp.net-core,C#,.net,Linq,Asp.net Core,我有以下XML文档 <?xml version = "1.0" encoding = "utf-8"?> <flights_for_sale> <ad id="0001" createdon ="11/02/20" expireson="12/02/20"> <aircraft id="A10"> <
<?xml version = "1.0" encoding = "utf-8"?>
<flights_for_sale>
<ad id="0001" createdon ="11/02/20" expireson="12/02/20">
<aircraft id="A10">
<year> 1977 </year>
<make> <![CDATA[&c;]]> </make>
<model> Skyhawk </model>
<color> Light blue and white </color>
<description>
New paint, nearly new interior,
685 hours SMOH, full IFR King avionics
</description>
<price> 23,495 </price>
</aircraft>
<seller id = "s001" phone="123-123-123"> Skyway Aircraft </seller>
<seller id = "s002" phone="123-123-222"> Boeing </seller>
<seller id = "s003" phone="123-123-233"> McDouglas </seller>
<membership id="1000" from="12/03/16" to="12/03/18" no="M0001">Silver</membership>
<membership id="1000" from="12/03/16" to="12/03/18" no="M0002">Gold</membership>
<membership id="1000" from="12/03/16" to="12/03/18" no="M0003">Platinum</membership>
<location>
<city> Rapid City, </city>
<state> South Dakota </state>
</location>
</ad>
<ad id="002" createdon ="11/05/20" expireson="12/05/20">
<aircraft>
<year> 1965 </year>
<make> &p; </make>
<model> Cherokee </model>
<color> Gold </color>
<description>
240 hours SMOH, dual NAVCOMs, DME,
new Cleveland brakes, great shape
</description>
</aircraft>
<seller phone="555-333-2222" email="jseller@www.axl.com" id="s004">John Seller</seller>
<membership id="1000" from="12/03/16" to="12/03/18" no="M0020">State Membership</membership>
<membership id="1000" from="12/03/16" to="12/03/18" no="M0002">Gold</membership>
<location>
<city> St. Joseph, </city>
<state> Missouri </state>
</location>
</ad>
</flights_for_sale>
然后,我编写了以下代码来读取XML上的元素/属性,并将数据填充到Advert2
对象结构中
var xmlPath2 = System.IO.Path.Combine("../../../data/" + "XMLFile2.xml");
var xml2 = XDocument.Load(xmlPath2);
var query2 = xml2.Root.Descendants("ad").Select(n => new Advert2 {
Id = Convert.ToInt32(n.Parent.TryGetAttribtueValue("ad", "id")),
CreatedOn = Convert.ToDateTime( n.Parent.TryGetAttribtueValue("ad", "createdon") ),
ExpiresOn = Convert.ToDateTime(n.Parent.TryGetAttribtueValue("ad", "expireson")),
MyAircraft = new Aircraft {
Make = n.TryGetElementValue("make"),
Model = n.TryGetElementValue("model"),
Description = n.TryGetElementValue("description"),
Price = Convert.ToDecimal( n.TryGetElementValue("price") ) },
MySellers = new List<Seller2>().Add( new Seller2 {
Id = Convert.ToInt32( n.TryGetAttribtueValue("seller","id") ),
SellerName = n.TryGetElementValue("seller"),
Phone = n.TryGetAttribtueValue("seller","phone")
} )
}).ToList();
var xmlPath2=System.IO.Path.Combine(“../../../data/”+“XMLFile2.xml”);
var xml2=XDocument.Load(xmlPath2);
var query2=xml2.Root.substands(“ad”).Select(n=>newadvert2{
Id=转换为32(n.Parent.tryGetAttributeValue(“ad”、“Id”),
CreatedOn=Convert.ToDateTime(n.Parent.tryGetAttributeValue(“ad”,“CreatedOn”)),
ExpiresOn=Convert.ToDateTime(n.Parent.tryGetAttributeValue(“ad”,“ExpiresOn”)),
MyAircraft=新飞机{
Make=n.TryGetElementValue(“Make”),
模型=n.TryGetElementValue(“模型”),
Description=n.TryGetElementValue(“Description”),
Price=Convert.ToDecimal(n.TryGetElementValue(“Price”)),
MySellers=new List().Add(新卖家2{
Id=转换为32(n.tryGetAttributeValue(“卖方”,“Id”)),
SellerName=n.TryGetElementValue(“卖方”),
电话=n.tryGetAttributeValue(“卖方”、“电话”)
} )
}).ToList();
但问题是,当我试图创建对象来填充MySellers
List时,出现了语法错误
错误:
错误CS0029无法将类型“void”隐式转换为System.Collections.Generic.List 所以我似乎不知道如何填充这两个集合
MySellers
和MyMemberships
是否有其他方法来填充这两个集合,以便我可以创建
Averts2
集合?我知道这不完全符合问题的精神。然而,它应该尽可能简单
var xmlStream = new StreamReader(@"D:\something.xml");
var serializer = new XmlSerializer(typeof(flights_for_sale));
var result = (flights_for_sale)serializer.Deserialize(xmlStream);
下面是通过将xml粘贴到VisualStudio中获得的
编辑以便基本上将XML反向工程为代码?真聪明!看起来我的文档结构有点异乎寻常,因为集合必须包含在其父集合标记中,就像所有卖方节点都必须包含在标记中一样。。。。但是他们再次强调,如果有一个文档没有遵循标准的结构……我认为我的文档应该采用非正统的样式:)@eutychostfar是的,我不太确定这是否能帮助您满足您的需要,好答案:)不管XML文档的结构如何,它都会生成数据
var xmlPath2 = System.IO.Path.Combine("../../../data/" + "XMLFile2.xml");
var xml2 = XDocument.Load(xmlPath2);
var query2 = xml2.Root.Descendants("ad").Select(n => new Advert2 {
Id = Convert.ToInt32(n.Parent.TryGetAttribtueValue("ad", "id")),
CreatedOn = Convert.ToDateTime( n.Parent.TryGetAttribtueValue("ad", "createdon") ),
ExpiresOn = Convert.ToDateTime(n.Parent.TryGetAttribtueValue("ad", "expireson")),
MyAircraft = new Aircraft {
Make = n.TryGetElementValue("make"),
Model = n.TryGetElementValue("model"),
Description = n.TryGetElementValue("description"),
Price = Convert.ToDecimal( n.TryGetElementValue("price") ) },
MySellers = new List<Seller2>().Add( new Seller2 {
Id = Convert.ToInt32( n.TryGetAttribtueValue("seller","id") ),
SellerName = n.TryGetElementValue("seller"),
Phone = n.TryGetAttribtueValue("seller","phone")
} )
}).ToList();
var xmlStream = new StreamReader(@"D:\something.xml");
var serializer = new XmlSerializer(typeof(flights_for_sale));
var result = (flights_for_sale)serializer.Deserialize(xmlStream);