1

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

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

你能帮帮我吗?

4

2 回答 2

2

以下 LINQ to XML 查询将返回MyNode填充了消息 id 和附件属性值的对象。如果未找到某些属性,则使用默认值“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();

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

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

于 2013-06-15T20:37:01.817 回答
1

不幸的是,这只适用于Valueis null,而不是实际XAttributeis null

你必须做这样的事情:

XAttribute temp = xDoc.GetElementsByTagName("Message")[0].Attributes["appendix"];
if (temp == null)
{
    node.appendix = temp.Value;
} 
else
{
    node.appendix = "NULL";
}
于 2013-06-15T20:30:50.353 回答