C# 用默认值替换不存在的XML属性

C# 用默认值替换不存在的XML属性,c#,xml,xml-parsing,C#,Xml,Xml Parsing,我正在尝试为XML文档制作一个XML解析器,其中节点中有一些可选属性,我正在寻找一种优雅的方法,如何解决“对象引用未设置为实例”的问题。 我已经读过这个主题,它非常相似,下面的代码似乎很有希望: string text = (string) foo.Element("Text") ?? "Default value"; 然而,当我尝试实现它时,“对象引用未设置为实例”仍然出现,因此我正在寻找另一种解决方案。这是我不顾一切的努力的一部分 XML文件1: ... <Message id ="

我正在尝试为XML文档制作一个XML解析器,其中节点中有一些可选属性,我正在寻找一种优雅的方法,如何解决“对象引用未设置为实例”的问题。 我已经读过这个主题,它非常相似,下面的代码似乎很有希望:

string text = (string) foo.Element("Text") ?? "Default value";
然而,当我尝试实现它时,“对象引用未设置为实例”仍然出现,因此我正在寻找另一种解决方案。这是我不顾一切的努力的一部分

XML文件1:

...
<Message id ="1" appendix = "abc" ></Message>
...

你能帮我一下吗?

不幸的是,只有当
null
时,这才有效,而实际
XAttribute
null
时则无效

您必须执行以下操作:

XAttribute temp = xDoc.GetElementsByTagName("Message")[0].Attributes["appendix"];
if (temp == null)
{
    node.appendix = temp.Value;
} 
else
{
    node.appendix = "NULL";
}

以下LINQ to XML查询将返回
MyNode
对象,其中填充消息id和附录属性的值。如果未找到某个属性,则使用默认值“NULL”:

如果xml文档中没有
Message
元素,则将返回
null


顺便说一句,当您使用LINQ转换XML时,使用强制转换节点转换
(string)
比访问其
属性更好。因为若在文档中找不到节点,那个么若尝试获取
null
Value
属性,就会得到
NullReferenceException
。但当您将节点强制转换为
string
时,只需获得
null
值,而不是异常。这允许您使用null合并运算符提供默认值。

调试器说什么是null?[“附录”]属性。。。我得到空引用异常:对象引用未设置为对象的实例。或者可能是属性的值,我不确定。非常感谢您详尽的回答。现在,我对解析过程有了更好的理解。然而,你的同事的答案更容易在我的代码中实现(我不得不重新编写更少的代码行),所以我接受了他的答案。。。无论如何,非常感谢您的回答。使用
node.appendix=temp==null可以看起来更好一点吗?“空”:温度值
public MyNode Parse(string file)
{
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load(file);

    MyNode node = new MyNode();
    node.messageID = (string)xDoc.GetElementsByTagName("Message")[0].Attributes["id"].Value ?? "NULL";
    node.appendix = (string)xDoc.GetElementsByTagName("Message")[0].Attributes["appendix"].Value ?? "NULL";

    return node;
}
XAttribute temp = xDoc.GetElementsByTagName("Message")[0].Attributes["appendix"];
if (temp == null)
{
    node.appendix = temp.Value;
} 
else
{
    node.appendix = "NULL";
}
var xDoc = XDocument.Load(file);
var node = xDoc.Descendants("Message")
               .Select(m => new MyNode {
                   messageID = (string)m.Attribute("id") ?? "NULL",
                   appendix = (string)m.Attribute("appendix") ?? "NULL"
               }).FirstOrDefault();