Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到XML嵌套元素_C#_Xml_Linq - Fatal编程技术网

C# LINQ到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

我可以读取XML并返回Order元素

我还需要返回ShippingAddress,它嵌套在Order元素中。(姓名、地址行1、城市、邮政编码、国家代码、电话)同时从XML响应中删除

请有人告诉我如何同时到达发货地址

我现在的代码是

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();