2015-04-30 5 views
2
<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 для этой цели я использовал код следующего: ->Вставьте XElements после конкретного узла

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)); 

Но Ошибка Объект refrence не установлен в экземпляр объекта. Как я могу исправить свой код выше. Спасибо!

+1

Ну, может быть, вы не * получили * пользователей, соответствующих вводу? Было бы лучше использовать 'First()' здесь, а не 'FirstOrDefault()', как если бы не было каких-либо совпадающих элементов, вы * будете * получать 'NullReferenceException', что менее понятно, чем' First() 'going bang говоря, что матчей нет. –

+0

Короткая, но полная программа, демонстрирующая проблему, поможет нам помочь вам, хотя ... –

+1

Вы можете заменить 'Where'' FirstOrDefault' с 'Single',' SingleOrDefault', 'First' и' FirstOrDefault' ' Где это происходит, когда это необходимо. –

ответ

1

Вы получаете Ссылка на объект Exception, потому что нет Идентификатор пользователя не должно быть соответствие значение присутствующего в usrCookieId. Вы должны проверить обнуляет, чтобы избежать этого исключения, первое извлечения элемента и добавить его после подтверждения, если этот узел пользователя присутствует: -

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

Это возвращает первую найденную XElement или нуль в случае, если нет такого узла пользователя обнаруживаются, так что вы можете просто проверить это условие и добавить соответственно: -

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 не был хорошо сформирован, и это будет генерировать исключение времени выполнения. Так что лучше иметь корневой узел следующим образом: -

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

Я не упоминал, но есть то же, что и у, но спасибо за это. и книга, которую вы написали, действительно хороша Спасибо –

1

Вы не найдете совпадения, так что либо usrCookieID не соответствует ни одному идентификатору, ни, возможно, более вероятно, User не является корнем вашего XML. Если это не так, возможно, Descendants будет более уместным здесь - это находит любой элемент User в документе.

First (или Single, если идентификатор уникален) было бы более подходящим, чем FirstOrDefault, поскольку лучшее исключение было бы выбрано. Это вызовет исключение, объясняющее, что ни один элемент не был найден, а не бесполезен NullReferenceException.

Чтобы добавить дочерний элемент к вашему результату, вам необходимо использовать Add. AddAfterSelf добавит элемент брата.

Так, что-то вроде:

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

user.Add(new XElement(...)); 
Смежные вопросы