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