我正在尝试为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;
}
你可以帮帮我吗?
答案 0 :(得分:1)
不幸的是,仅当Value
为null
时才有效,而不是实际的XAttribute
为null
。
你必须做这样的事情:
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运算符提供默认值。