在特定节点之后插入XElements

时间:2015-04-30 15:55:01

标签: c# xml linq

  <user Id="4/30/2015 10:16:52 AM">
    <city>Bathinda</city>
    <city>Moga</city>
    <city>Patiala</city>
    <city>Amritsar</city>
    <city>Faridkot</city>
  </user>

我想在具有Id属性值的用户节点下创建一个用于此目的的条目我已经使用了以下代码: - &gt;

 xmlDocument.Elements("user")
            .Where(x => (string)x.Attribute("Id") == usrCookieId)
            .FirstOrDefault()
            .AddAfterSelf(
                 new XElement("adults", drpAdult1.SelectedIndex),
                 new XElement("kids", Convert.ToInt32(drpKids.SelectedIndex)),
                 new XElement("infants", Convert.ToInt32(drpInfants.SelectedIndex)),
                 new XElement("startingDate", datePicker.Value),
                 new XElement("startingCity", drpStartingCity.SelectedValue ));

但错误是对象引用未设置为对象的实例。 我怎样才能纠正上面的代码。 谢谢!

2 个答案:

答案 0 :(得分:1)

您没有找到匹配项,因此usrCookieID不等于任何ID,或者更可能是User不是{n} XML的根。如果不是,那么Descendants可能更合适 - 这会在文档中找到任何User元素。

First(如果Id是唯一的,则为Single)比FirstOrDefault更合适,因为会抛出更好的异常。这将抛出一个异常,解释没有找到任何元素而不是无用的NullReferenceException

要在结果中添加子元素,您需要使用AddAddAfterSelf将添加一个兄弟元素。

所以,比如:

var user = xmlDocument.Descendants("user")
    .Where(x => (string)x.Attribute("Id") == usrCookieID)
    .Single();

user.Add(new XElement(...));

答案 1 :(得分:1)

您正在获取对象引用异常,因为没有用户ID必须与usrCookieId中的值匹配。您需要通过首先获取元素并在确认该用户节点是否存在后添加它来检查空值以避免此异常: -

XElement userNode = xdoc.Descendants("user")
                        .FirstOrDefault(x => (string)x.Attribute("Id") == usrCookieId);

这将返回第一个匹配的XElement,如果没有找到这样的用户节点,则返回null,这样您就可以简单地检查这个条件并相应地添加: -

if (userNode != null)
{
       userNode.AddAfterSelf(new XElement("adults", "3"),
                             new XElement("kids", 2),
                             new XElement("infants", 5),
                             new XElement("startingDate", "23/01.2015"),
                             new XElement("startingCity", "Delhi"));
}

此外,请注意,因为您打算在user下面添加此新节点,您需要拥有根节点,因为当前user充当根节点,并且通过添加此新节点,您将进行你没有很好地形成XML,它会抛出一个运行时异常所以最好有一个这样的Root节点: -

 <Users>
  <user Id="1">
    <city>Bathinda</city>
    <city>Moga</city>
    <city>Patiala</city>
    <city>Amritsar</city>
    <city>Faridkot</city>
  </user>
</Users>