我不知道为什么我在这方面遇到这么多麻烦,但我希望有人可以指引我指出正确的方向。
我有几行代码:
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
节点是否存在?
答案 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