Почему это вызывает исключение NullReferenceException? - PullRequest
0 голосов
/ 27 марта 2011
private void alterNodeValue(string xmlFile, string parent, string node, string newVal)
{
    XDocument xml = XDocument.Load(this.dir + xmlFile);

    if (xml.Element(parent).Element(node).Value != null)
    {
        xml.Element(parent).Element(node).Value = newVal;
    }
    else
    {
        xml.Element(parent).Add(new XElement(node, newVal)); 
    }

    xml.Save(dir + xmlFile); 
}  

Почему этот бросок

Исключение System.NullReferenceException не было обработано кодом пользователя

в этой строке

if (xml.Element(parent).Element(node).Value != null)

Я предполагаю, что это потому, что узел XML не существует, но это то, что != null должен проверять. Как мне это исправить?

Я пробовал несколько вещей, и они ВСЕ выдают одно и то же исключение в какой-то момент во время проверки ненулевого значения.

Спасибо за любую помощь.

Ответы [ 6 ]

7 голосов
/ 27 марта 2011

Либо xml.Element(parent), либо Element(node), к которому вы пытаетесь получить доступ из возвращаемого значения xml.Element(parent), равного null.

Такая реструктуризация позволит вам увидеть, какое это:

var myElement = xml.Element(parent);
if (xmyElement != null)
{
    var myNode = myElement.Element(node);
    if(myNode != null)
    {
      myNode.Value = newVal;
    }
}

Обновление:

Из вашего комментария похоже, что вы хотите сделать это:

if (xml.Element(parent).Element(node) != null)  // <--- No .Value
{
    xml.Element(parent).Element(node).Value = newVal;
}
else
{
    xml.Element(parent).Add(new XElement(node, newVal)); 
}
1 голос
/ 27 марта 2011

Как минимум:

private void alterNodeValue(string xmlFile, string parent, string node, string newVal)
{
    XDocument xml = XDocument.Load(this.dir + xmlFile);
    XElement parent = xml.Element(parent).Element(node);
    if (parent  != null)
    {
        parent.Value = newVal;
    }
    else
    {
        xml.Element(parent).Add(new XElement(node, newVal)); 
    }    
    xml.Save(dir + xmlFile); 
}  

Лучше:

private void alterNodeValue(string xmlFile, string parent, string node, string newVal)
{
    string path = System.IO.Path.Combine(dir, xmlFile);
    XDocument xml = XDocument.Load(path );
    XElement parent = xml.Element(parent).Element(node);
    if (parent != null)
    {
        XElement node = parent.Element(parent);
        if (node != null)
        {
            node.Value = newVal;
        }
        else
        {
            // no node
        }
    }
    else
    {
        // no parent
    }    
    xml.Save(path); 
}  
1 голос
/ 27 марта 2011

Попробуйте изменить выражение if на следующее:

if (xml.Element(parent).Element(node) != null)

Если узел в родительском элементе имеет значение null, вы не можете получить доступ к элементу нулевого объекта.

1 голос
/ 27 марта 2011

Вам нужно проверить, если:

Element(node) != null

Прежде чем позвонить. Значение. Если Элемент (узел) == нуль, то вызов .Value вызовет исключение нулевой ссылки.

Dan

1 голос
/ 27 марта 2011

Это почти наверняка, потому что это возвращает нуль:

xml.Element(parent)
0 голосов
/ 23 апреля 2015
        if (xml.Element(parent) != null)
        {
            var myNode = xml.Element(parent).Element(node);
            if (node != null)
                myNode.Value = newVal;
        }
        else
        {
            xml.Element(parent).Add(new XElement(node, newVal));
        }
...