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

本文关键字:节点 存在 检查 是否 XML- | 更新日期: 2023-09-27 18:22:47

我不知道为什么我会遇到这么多麻烦,但我希望有人能给我指明正确的方向。

我有这几行代码:

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%的情况下它工作得很好。

我的问题:

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

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

如果节点不存在,则返回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。

您能使用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)

您也可以这样做:

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

您可以像这样检查

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

我认为更干净的方法是:

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
}

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

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

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