从列表中向xml添加元素

时间:2012-11-19 02:29:42

标签: c# xml linq-to-xml

我有一个问题,我无法弄清楚是什么问题。我想从列表框中将元素插入到我的XML文件中。在列表框中有Menuelem元素,它有一个字符串和一个int变量。

    dt = DateTime.Now;
    XDocument doc = XDocument.Load(path);

    XElement user = new XElement("user", new XAttribute("id", id),
                        new XElement("order", new XAttribute("id", key),
                            new XElement("date", dt.ToString()))
                    );
    doc.Element("orders").Add(user);
    doc.Save(path);
    foreach (Menuelem item in listBox6.Items)
    {
        int j=0;
        var menuelem = new XElement("menuelem", new XAttribute("db", j),
                       new XElement("name", item.Nev),
                       new XElement("price", item.Ar));
        doc.Element("order").Add(menuelem); //throws nullreferenceexception
        doc.Save(path);
        j++;
    }

    listBox6.Items.Clear();
    label3.Text = "";
    key++;

}

我想看看我的XML是这样的:

<?xml version="1.0" encoding="utf-8" ?> 
<orders>
 <user id="0">
  <order id="0">
   <date>2012.11.19. 2:16:12</date>
   <menuelem db = "0">
    <name>asdasdas</name>
    <price>1000</price>
   <menuelem db = "1">
    <name>asds</name>
    <price>2000</price>
  </order>
 <user id="0">
  <order id="1">
    <date>2012.11.19. 2:16:15</date>
    <menuelem db = "0">
      <name>asdasdas</name>
      <price>1000</price>
    <menuelem db = "1">
      <name>asds</name>
      <price>2000</price>
   </order>
 </user>
</orders>

任何人都可以使用linq解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

你有空参考,因为你没有“订购”作为根元素,所以你需要这样做

 XElement element =  doc.Element("orders").Element("user").Element("order");
 element.Add(menuelem);

如果“users”中有多个元素,则可以使用Method“Elements”而不是“Element”。 “Element”方法将返回第一个元素,“Elements”方法将返回XElement的IEnumerable。

答案 1 :(得分:-1)

它抛出NullReferenceException,因为显然文档中没有“order”元素,因此doc.Element("order")返回null。

答案 2 :(得分:-1)

您的代码尝试查找“order”元素作为文档的直接子元素,该元素仅包含根元素(“orders”),结果为null。有关搜索元素的内容以及何时返回null的详细信息,请参阅Element

您需要正确选择新插入的元素。简单的选择是按名称使用Descendants并选择最后一个(通过添加添加的用户)

 doc.Descendants("order").Last().Add(menuelem);

更简单的选择是完全构建“user”元素,然后将其添加到树中。您不需要搜索刚添加到其中的节点的文档。