Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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 - Fatal编程技术网

C# 使用Linq查询XML的帮助

C# 使用Linq查询XML的帮助,c#,xml,C#,Xml,我有这个XML,我希望能够提取订单#,项目,数量,项目价格(本金,税,也可以是其他)。以下是XML(见下文)。我遇到的问题是价格。有了它,你可以0到多个价格成分,税收,本金等。我怎样才能把它们拉到一行输出 现在我可以得到订单号,项目号,数量…但当我把价格拉出来时,我会得到一条关于税和prinicpal的线 另一个问题是,如果在某些情况下没有税收,会发生什么?我会得到一个空引用,不是吗?我想尝试处理这些问题,并将其替换为0。非常感谢您的任何建议 XML: 这是可行的,尽管承认有点尴尬。我可能会使用

我有这个XML,我希望能够提取订单#,项目,数量,项目价格(本金,税,也可以是其他)。以下是XML(见下文)。我遇到的问题是价格。有了它,你可以0到多个价格成分,税收,本金等。我怎样才能把它们拉到一行输出

现在我可以得到订单号,项目号,数量…但当我把价格拉出来时,我会得到一条关于税和prinicpal的线

另一个问题是,如果在某些情况下没有税收,会发生什么?我会得到一个空引用,不是吗?我想尝试处理这些问题,并将其替换为0。非常感谢您的任何建议

XML:


这是可行的,尽管承认有点尴尬。我可能会使用一对let变量来保存我想要的子组件(假设您只需要这两个特定的值)

由于Where子句出现问题,已编辑以删除let。我认为select中的Where并没有问题,但它可能也有同样的问题

var orders = from amznorders in customer.Root.Elements("Order")    
             from amznfulfill in amznorders.Elements("Fulfillment")    
             from amznitems in amznfulfill.Elements("Item")    
             from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")    
             select new    
                         {    
                                OrderNumber = (string)amznorders.Element("AmazonOrderID"),    
                                ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),    
                                Qty = (string)amznitems.Element("Quantity"),
                                PriceAmount = amznitemprc.Where(xe => xe.Element("Type").Value == "Principal").FirstOrDefault().Value,
                                TaxAmount = amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault() == null ? string.Empty : amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault(),
                                TotalItemPrice = amznitemprc.Sum(xe => decimal.Parse(xe.Element("Amount").Value)).ToString(),
                                //Address1 = (string)address1.Element("Address1")    
                         };

雅各布,用另一种方法会更好吗?我不是被Linq困住了,只是觉得我应该好好利用它。谢谢你的提示,我会检查它。当我尝试它时,let变量中的Where似乎无法识别。有什么想法吗?很有趣。我不知道以后会不会在哪里注册。我明天才能测试,但我会在中编辑一些内容。不过会有点复杂。
            XDocument customer = XDocument.Load(@"C:\LinqToXML.xml");

            var orders = from amznorders in customer.Root.Elements("Order")
                         from amznfulfill in amznorders.Elements("Fulfillment")
                         from amznitems in amznfulfill.Elements("Item")
                         from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")
                             select new
                                        {
                                            OrderNumber = (string)amznorders.Element("AmazonOrderID"),
                                            ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),
                                            QTY = (string)amznitems.Element("Quantity"),
                                            //This is where I need help...if type = Principal set PriceAmount else Set PriceTax?//
                                            PriceAmount = (string)amznitemprc.Element("Amount")
                                            //Address1 = (string)address1.Element("Address1")
                                     };

            foreach (var order in orders)
            {
                Console.WriteLine("Order: {0} ItemNumber: {1} QTY: {2} PriceAmount: {3} ", order.OrderNumber, order.ItemNumber, order.QTY, order.PriceAmount);

            }
var orders = from amznorders in customer.Root.Elements("Order")    
             from amznfulfill in amznorders.Elements("Fulfillment")    
             from amznitems in amznfulfill.Elements("Item")    
             from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")    
             select new    
                         {    
                                OrderNumber = (string)amznorders.Element("AmazonOrderID"),    
                                ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),    
                                Qty = (string)amznitems.Element("Quantity"),
                                PriceAmount = amznitemprc.Where(xe => xe.Element("Type").Value == "Principal").FirstOrDefault().Value,
                                TaxAmount = amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault() == null ? string.Empty : amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault(),
                                TotalItemPrice = amznitemprc.Sum(xe => decimal.Parse(xe.Element("Amount").Value)).ToString(),
                                //Address1 = (string)address1.Element("Address1")    
                         };