C# LINQ到XML嵌套元素
我可以读取XML并返回Order元素 我还需要返回ShippingAddress,它嵌套在Order元素中。(姓名、地址行1、城市、邮政编码、国家代码、电话)同时从XML响应中删除 请有人告诉我如何同时到达发货地址 我现在的代码是C# LINQ到XML嵌套元素,c#,xml,linq,C#,Xml,Linq,我可以读取XML并返回Order元素 我还需要返回ShippingAddress,它嵌套在Order元素中。(姓名、地址行1、城市、邮政编码、国家代码、电话)同时从XML响应中删除 请有人告诉我如何同时到达发货地址 我现在的代码是 private static IEnumerable<FormsPersistence> Addresses(XContainer doc) { XNamespace ns = "https://mws.amazonservices
private static IEnumerable<FormsPersistence> Addresses(XContainer doc)
{
XNamespace ns = "https://mws.amazonservices.com/Orders/2013-09-01";
return from address in doc.Descendants(ns + "Order")
select new FormsPersistence
{
AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
};
}
private static void OrderDetails(IEnumerable<FormsPersistence> addresses)
{
foreach (var address in addresses)
{
Console.WriteLine("---");
Console.WriteLine(address.AmazonOrderId);
Console.WriteLine(address.PurchaseDate);
Console.WriteLine(address.BuyerName);
Console.WriteLine(address.BuyerEmail);
Console.WriteLine(address.OrderStatus);
Console.WriteLine("---");
}
}
我补充说
class ShippingAddress
{
public string Name { get; set; }
public string AddressLine { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public string CountryCode { get; set; }
public string Phone { get; set; }
}
好吧,假设
FormsPersistence
具有保存该属性的属性,您可以执行以下操作:
return from address in doc.Descendants(ns + "Order")
let shipping=address.Element(ns+"ShippingAddress")
select new FormsPersistence
{
AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
ShippingAddress= new ShippingAddress{Name=(string)shipping.Element(ns+"Name"),
AddressLine=(string)shipping.Element(ns+"AddressLine1"),
}
};
您需要使用
Element
方法,该方法允许您获取当前节点的内部元素,并且在let
子句的帮助下,您可以保存结果以便稍后在投影中使用,正如我在上面的代码中所示。诀窍是使用Elements,然后使用FirstOrDefault()
但是要在结果中放置发货地址的地方,是
FormsPersistence
的属性吗?是的,我在FormsPersistence中设置了它们,例如公共字符串名称{get;set;}我得到的类型或命名空间名称“ShippingAddress”找不到(您是否缺少using指令或程序集引用?)在VS on new ShippingAddress中突出显示是的,我假设您的模型中有一个具有该名称的属性(这是一个自定义类),如果您没有该属性,您可以创建它或添加属性以将装运信息直接保存在您的FormPersistence
类对不起,我的基本知识正在学习中。我添加了一个新的类ShippingAddress,其中我添加了名称和地址行。我现在无法将类型'AmazonMWS.src.MarketplaceWebServiceOrders.ShippingAddress'隐式转换为'string',您需要用于shipping的命名空间:let shipping=address.Element(ns+“ShippingAddress”)
查看查询,我正在创建ShippingAddress
的新实例:new ShippingAddress{}
,我没有直接执行ShippingAddress=(字符串)shipping.Element(…)
class ShippingAddress
{
public string Name { get; set; }
public string AddressLine { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public string CountryCode { get; set; }
public string Phone { get; set; }
}
return from address in doc.Descendants(ns + "Order")
let shipping=address.Element(ns+"ShippingAddress")
select new FormsPersistence
{
AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
ShippingAddress= new ShippingAddress{Name=(string)shipping.Element(ns+"Name"),
AddressLine=(string)shipping.Element(ns+"AddressLine1"),
}
};
return doc.Descendants(ns + "Order").Select(address => new FormsPersistence()
{
AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
ShippingAddress = address.Elements(ns + "ShippingAddress").Select(shipping => new {
name = (string)shipping.Element(ns + "Name")
}).FirstOrDefault()
}).ToList();