使用Linq与来自DB的数据嵌套XML标记

时间:2016-11-11 14:34:16

标签: c# xml linq

我正在尝试使用Linq,XElement和数据库中的数据构建XML文档,

它有点工作,但在我的XML中,我想关闭标记并启动一个新标记并从查询中获取结果以填充标记,它正在抱怨我的变量r标签是未解决的,我如何使这项工作,或有更好的方法来构建XML。所有子元素都应该在父母之下,有两个孩子,并且有自己的孩子。

以下是代码

public void GenerateXML(int id, string site, string state, string country, string bFn, string bLn, string sFn, string sLn)
    {
        var results = (from o in _db.Orders
            where o.OrderId == id
            select o).ToList();


        var xmlDoc = new XElement("Order",
            from r in results
            select
            new XElement("OrderHeader",

                new XElement("SiteId", site),
                new XElement("OrderId", r.OrderId),
                new XElement("Time", r.OrderDate.Value),
                new XElement("Subtotal", r.SubTotal),
                new XElement("Shipping", ""),
                new XElement("SalesTax", r.SalesTax),
                new XElement("Total", r.Total),
                new XElement("PaymentAmount", ""),
                new XElement("PaymentMethod", ""),
                new XElement("ArchiTypeAcctNum", "20001"),
                new XElement("TaxExempt", r.TaxExempt), 
                new XElement("SpecialInstructions", r.SpecialInstructions),
                new XElement("BillTo",
                    new XElement("BillEmail", r.BillToEmail),
                    new XElement("FirstName", bFn),
                    new XElement("LastName", bLn),
                    new XElement("CompanyName", r.BillCompany),
                    new XElement("Address1", r.BillToAddress),
                    new XElement("City", r.BillToCity),
                    new XElement("State", state),
                    new XElement("Country", country),
                    new XElement("Zip", r.BillToZip),
                    new XElement("Phone", r.BillToPhoneNumber)),
                new XElement("ShipTo",
                    new XElement("FirstName", sFn),
                    new XElement("LastName", sLn),
                    new XElement("CompanyName", r.ShipCompany),
                    new XElement("Address1", r.ShipToAddress),
                    new XElement("City", r.ShipToCity),
                    new XElement("State", state),
                    new XElement("Country", country),
                    new XElement("Zip", r.ShipToZip),
                    new XElement("Phone", r.ShipToPhoneNumber))),
               new XElement("Items",
                from i in r.Items
                select new XElement("Item",
                    new XElement("SKU", i.SkuNumber),
                    new XElement("PROD_Name", i.ProductName),
                    new XElement("Description", i.Description),
                    new XElement("Attributes", i.Attributes),
                    new XElement("Quantity", i.Quantity),
                    new XElement("UnitPrice", i.UnitPrice),
                    new XElement("InkColor", i.InkColor)))              
                    );

        xmlDoc.Save(Server.MapPath(@"~/Xml/Orders.xml"));
        RedirectToAction("Save");
    }

1 个答案:

答案 0 :(得分:1)

我为同样的目的写了一个扩展名。我觉得更容易。你可以使用order.EntityToXml();

public static class XmlExtensions
{


        public static bool EntityToXml<T>(this T entity, string filePath)
        {

            if (string.IsNullOrEmpty(filePath))
            {
                throw new ArgumentNullException(nameof(filePath));
            }

            var dir = Path.GetDirectoryName(filePath);

            if (string.IsNullOrEmpty(dir))
            {
                throw new ArgumentNullException(nameof(filePath));
            }

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            var serializer= new System.Xml.Serialization.XmlSerializer(typeof(T));

            using (var stream = new StreamWriter(filePath))
            {
                serializer.Serialize(stream , entity);
                return true;

            }
        }
}