使用LINQ在XML中使用C#创建对象

时间:2014-08-11 08:42:11

标签: c# xml linq oop

嘿所以我首先要说的是这是一项任务......我必须创建一个基于控制台的购物车,它可以加载并保存到XML文件中。

我无法弄清楚如何将XML文件加载到对象中/这是最好的方法....

 class Product
{
    public int RecordNumber { get; set; }
    public String Name { get; set; }
    public int Stock { get; set; }
    public int Price { get; set; }       
}
 class Cart
{

    public List<Product> items
    {
        get { return items; }
        set { items = value; }
    }

    public Cart() {}  //Right way to do constructor?

    public void AddProduct(Product prod)
    {
        items.Add(prod);
    }

    public void RemoveProduct(Product prod)
    {
        items.Remove(prod);
    }
}

static void Main(string[] args)
    {
 XDocument XDoc = XDocument.Load("inventory.xml"); // Loading XML file
        var result = from q in XDoc.Descendants("product")
            select new Product
            {
                RecordNumber = Convert.ToInt32(q.Element("recordNumber").Value),
                Name = q.Element("name").Value,
                Stock = Convert.ToInt32(q.Element("stock").Value),
                Price = Convert.ToInt32(q.Element("price").Value)
            };

XML文件设置如下(产品的十个条目):

 <product>
    <recordNumber>1</recordNumber>
    <name>Floo Powder</name>
    <stock>100</stock>
    <price>5</price>
</product>

我这里有两个问题......我的主要方法是加载XML文件并创建10个对象吗?如果是这样,我该如何访问这些对象?

其次,我打算将产品添加到购物车中,然后减少“库存”数字,但是当我想到它似乎是错误的时候。我应该为每个可用库存创建一个对象,然后将它们添加到购物车吗?关于我如何能够做到这一点的任何建议呢?

非常感谢!!

编辑:

我将不得不按照自己的意愿给用户添加/删除库存。我想在完成所有10个对象(记录号,名称,库存,价格)的详细信息之后,执行该操作的代码将会是这样的。

String input = Console.ReadLine();
foreach (var prod in result) {
  if (input == prod.recordnumber) {   // Assuming that user selects via indexnumber
   cart.AddProduct(//no idea what to put from here on
  }
}  

我是在正确的轨道上吗?

第二次编辑:

String productNumber = Console.ReadLine();
int productInt = Convert.ToInt32(productNumber);

var match = from p in result
where p.RecordNumber == productInt
   select p;

 if (match != null)
 {
   ShoppingCart.AddProduct(??);  //what variable do I put in the parentheses?
                                 // Need to also reduce stock
 }
   else
 {
    // Inform user that no product exists
 }

正如我在下面所说,我完全不知道括号中的内容。我试过匹配和p但显然他们不对。一旦我知道如何引用对象,我也应该能够减少对象的库存号,并将另一个实例放入列表中。

再次感谢您帮助我

2 个答案:

答案 0 :(得分:1)

您的程序正在结果变量中加载10个产品项目,并退出。要将它们放入购物车,您需要构建一个Cart对象,并将每个产品项添加到购物车:

static void Main(string[] args)
{
    XDocument XDoc = XDocument.Load("inventory.xml"); // Loading XML file
    var result = from q in XDoc.Descendants("product")
        select new Product
            {
                RecordNumber = Convert.ToInt32(q.Element("recordNumber").Value),
                Name = q.Element("name").Value,
                Stock = Convert.ToInt32(q.Element("stock").Value),
                Price = Convert.ToInt32(q.Element("price").Value)
             };

    var cart = new Cart();

    // Logic to add/remove/list cart here
}

要允许用户在购物车中添加/删除商品,您需要具有标识符,无论是添加/删除/列表,还是哪个项目。这必须是一个循环。您可能也会有退出条件。所以有以下几点:

var cmd = string.Empty;
do
{
    // Loop to allow the user to keep entering commands

    cmd = Console.ReadLine();        
    // if cmd == exit condition -> break;    
    // if cmd == list products condition -> write each prod to console
    // if cmd == add product condition -> Ask user to enter product number and add to cart
    // if cmd == remove product condition -> Ask user to enter product number and remove from cart
} while(true);

当用户输入产品编号时,您可以使用linq找到正确的产品:

var match = (from p in result
            where p.RecordNumber == productNumber
            select p).FirstOrDefault();

if (match != null)
{
    // Add/remove
}
else
{
    // Inform user that no product exists
}

答案 1 :(得分:0)

您可以使用XmlSerializer

var xmlSerializer = new XmlSerializer(typeof(List<Product>));

List<Product> productList;
using (var fileStreamReader = File.OpenRead("inventory.xml"));
{
    productList = (List<Product>) xmlSerializer.Deserialize(fileStreamReader);
}

使用LINQ 2 XML是可以的,但如果您只想将XML反序列化为对象表示,则序列化更容易。