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

时间:2013-06-15 20:15:49

标签: c# xml xml-parsing

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

string text = (string) foo.Element("Text") ?? "Default value";

但是,当我尝试实现它时,“对象引用未设置为实例”仍然出现,所以我正在寻找另一种解决方案。这是我绝望的努力。

XML文件1:

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

XML文件2:

...
<Message id ="2" ></Message>
...

我的解析器(在文件夹中的每个文件的循环中调用):

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;
}
你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,仅当Valuenull时才有效,而不是实际的XAttributenull

你必须做这样的事情:

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

答案 1 :(得分:1)

在LINQ to XML查询之后,将返回填充了消息ID和附录属性值的MyNode对象。如果找不到某个属性,则使用defalult值“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();

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

BTW当您使用LINQ to XML时,最好使用转换节点到(string)而不是访问其Value属性。因为如果在文档中找不到节点,那么如果您尝试获得NullReferenceException Value属性,则会获得null。但是当您将节点转换为string时,您只需获得null值而不是异常。这允许您使用null-coalescing运算符提供默认值。