如何检查xml中是否存在特定属性

xml的一部分:

我想检查每个节点,如果属性split存在,请尝试在变量中分配属性值。 在循环中。我试试

  foreach (XmlNode xNode in nodeListName) { if(xNode.ParentNode.Attributes["split"].Value != "") { parentSplit = xNode.ParentNode.Attributes["split"].Value; } } 

但我错了。如果条件只检查值不存在属性。我应该如何检查属性的存在。

您实际上可以直接索引到Attributes集合中(如果您使用的是C#而不是VB):

 foreach (XmlNode xNode in nodeListName) { XmlNode parent = xNode.ParentNode; if (parent.Attributes != null && parent.Attributes["split"] != null) { parentSplit = parent.Attributes["split"].Value; } } 

如果您的代码处理的是XmlElements对象(而不是XmlNodes ),那么就有方法XmlElement.HasAttribute(字符串名称) 。

因此,如果您只是在元素上寻找属性(从OP看起来像这样),那么作为元素进行强制转换可能会更加健壮,检查null,然后使用HasAttribute方法。

 foreach (XmlNode xNode in nodeListName) { XmlElement xParentEle = xNode.ParentNode as XmlElement; if((xParentEle != null) && xParentEle.HasAttribute("split")) { parentSplit = xParentEle.Attributes["split"].Value; } } 

你可以使用Linq-XML,

 XDocument doc = XDocument.Load(file); var result = (from ele in doc.Descendants("section") select ele).ToList(); foreach (var t in result) { if (t.Attributes("split").Count() != 0) { //Exist } // Suggestion from @UrbanEsc if(t.Attributes("split").Any()) { } } 

要么

  XDocument doc = XDocument.Load(file); var result = (from ele in doc.Descendants("section").Attributes("split") select ele).ToList(); foreach (var t in result) { // Response.Write("
" + t.Value); }

编辑

无视 – 你不能使用ItemOf(这是我在测试之前输入的内容)。 如果我能弄清楚如何……或者我只是删除答案,我会删除文本,因为它最终是错误和无用的。

结束编辑

您可以使用XmlAttributesCollection中的ItemOf(string)属性来查看该属性是否存在。 如果找不到,则返回null。

 foreach (XmlNode xNode in nodeListName) { if (xNode.ParentNode.Attributes.ItemOf["split"] != null) { parentSplit = xNode.ParentNode.Attributes["split"].Value; } } 

XmlAttributeCollection.ItemOf属性(String)

 var splitEle = xn.Attributes["split"]; if (splitEle !=null){ return splitEle .Value; } 

这是一个古老的问题,但仍然值得提及另一种处理这种情况的方法,即exception处理。 每次调用不存在的值时,您的代码都将从exception中恢复,并继续循环。 在catch-block中,当表达式(…!= null)返回false时,您可以像在else语句中将其写下来一样处理错误。 当然,抛出和处理exception是一种相对昂贵的操作,根据性能要求可能并不理想。

您可以使用GetNamedItem方法检查属性是否可用。 如果返回null,则它不可用。 这是您检查到的代码:

 foreach (XmlNode xNode in nodeListName) { if(xNode.ParentNode.Attributes.GetNamedItem("split") != null ) { if(xNode.ParentNode.Attributes["split"].Value != "") { parentSplit = xNode.ParentNode.Attributes["split"].Value; } } }