为什么这会抛出 NullReferenceException?

发布于 2024-10-27 00:09:34 字数 742 浏览 1 评论 0原文

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 应该检查的内容。我该如何解决这个问题?

我已经尝试了几件事,它们在非空检查期间的某个时刻都抛出了相同的异常。

感谢您的任何帮助。

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

Why does this throw

System.NullReferenceException was unhandled by user code

on this line

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

?

I'm guessing it's because the XML node doesn't exist, but that's what the != null is suppose to check for. How do I fix that?

I've tried several things and they ALL throw the same exception at some point during the not null check.

Thanks for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

原谅我要高飞 2024-11-03 00:09:34

您尝试从 xml.Element(parent) 的返回值访问的 xml.Element(parent)Element(node)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)); 
}

Either xml.Element(parent) or the Element(node) you are trying to access from the return value of xml.Element(parent) is null.

Restructuring like this will enable to you see which one it is:

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

Update:

From your comment it looks like you want to do this:

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)); 
}
埖埖迣鎅 2024-11-03 00:09:34

几乎可以肯定,因为这会返回 null:

xml.Element(parent)

It is almost certainly because this returns null:

xml.Element(parent)
终遇你 2024-11-03 00:09:34

您需要检查是否:

Element(node) != null

在调用 .Value 之前。如果 Element(node) == null,则调用 .Value 将抛出空引用异常。

You need to check if:

Element(node) != null

Before you call .Value. If Element(node) == null, then the call to .Value will throw a null reference exception.

Dan

满意归宿 2024-11-03 00:09:34

尝试将 if 语句更改为:

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

如果父元素中的节点为 null,则无法访问 null 对象的成员。

Try changing your if statement to this:

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

If the node in the parent element is null, you cannot access a member of a null object.

怀里藏娇 2024-11-03 00:09:34

至少:

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

At least:

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

Better:

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); 
}  
惯饮孤独 2024-11-03 00:09:34
        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));
        }
        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));
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文