XML - 检查特定节点是否存在

时间:2013-07-17 16:04:55

标签: c# xml

我不知道为什么我在这方面遇到这么多麻烦,但我希望有人可以指引我指出正确的方向。

我有几行代码:

var xDoc = new XmlDocument();
xDoc.LoadXml(xelementVar.ToString());

if (xDoc.ChildNodes[0].HasChildNodes)
{
    for (int i = 0; i < xDoc.ChildNodes[0].ChildNodes.Count; i++)
    {
        var sFormatId = xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"].Value;
        // Do some stuff
    }    
// Do some more stuff
}

问题是我得到的xDoc并不总是有formatID节点,所以我最终得到一个空引用异常,尽管99%的时间它完全正常工作

我的问题:

在尝试阅读formatID之前,如何检查Value节点是否存在?

6 个答案:

答案 0 :(得分:3)

您可以使用DefaultIfEmpty()吗?

E.g

var sFormatId = xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"]
                                  .Value.DefaultIfEmpty("not found").Single();

或者正如其他人所建议的那样,检查该属性是否为空:

if (xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"] != null)

答案 1 :(得分:2)

如果节点不存在,则返回null。

if (xDoc.ChildNodes[0].ChildNode[i].Attributes["formatID"] != null)
    sFormatId = xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"].Value;

你可以用快捷方式做到这一点

var sFormatId = xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"] != null ? xDoc.ChildNodes[0].ChildNodes[i].Attributes["formatID"].Value : "formatID not exist";

格式是这样的。

var variable = condition ? A : B;

这基本上是说如果条件为真,则变量= A,否​​则变量= B.

答案 2 :(得分:2)

你也可以这样做:

            if (xDoc.ChildNodes[0].HasChildNodes)
            {   
                foreach (XmlNode item in xDoc.ChildNodes[0].ChildNodes)
                {
                    string sFormatId;
                    if(item.Attributes["formatID"] != null)
                       sFormatId = item.Attributes["formatID"].Value;

                    // Do some stuff
                }     
            }

答案 3 :(得分:1)

你可以像这样检查

 if(null != xDoc.ChildNodes[0].ChildNode[i].Attributes["formatID"])

答案 4 :(得分:1)

我认为更清洁的方法是:

var xDoc = new XmlDocument();
xDoc.LoadXml(xelementVar.ToString());

foreach(XmlNode formatId in xDoc.SelectNodes("/*/*/@formatID"))
{
    string formatIdVal = formatId.Value; // guaranteed to be non-null
    // do stuff with formatIdVal
}

答案 5 :(得分:1)

在大多数情况下,我们遇到问题,因为XPath不存在,它返回null并且我们的代码因InnerText而中断。

您只能检查XPath是否存在,并且在不存在时返回null。

if(XMLDoc.SelectSingleNode("XPath") <> null)
  ErrorCode = XMLDoc.SelectSingleNode("XPath").InnerText