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

本文关键字:存在 是否 属性 XML 何检查 检查 | 更新日期: 2023-09-27 18:06:31

部分XML内容:

<section name="Header">
  <placeholder name="HeaderPane"></placeholder>
</section>
<section name="Middle" split="20">
  <placeholder name="ContentLeft" ></placeholder>
  <placeholder name="ContentMiddle"></placeholder>
  <placeholder name="ContentRight"></placeholder>
</section>
<section name="Bottom">
  <placeholder name="BottomPane"></placeholder>
</section>

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

在循环中,我尝试:

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

但是如果条件只检查值,而不检查属性的存在,我就错了。如何检查属性是否存在?

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

你可以直接索引属性集合(如果你使用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;
  }
}

仅供新手使用:最新版本的c#允许使用?操作符检查空赋值

parentSplit = xNode.ParentNode.Attributes["split"]?.Value;

您可以使用LINQ to 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("<br/>" +  t.Value);
 }
var splitEle = xn.Attributes["split"];
if (splitEle !=null){
    return splitEle .Value;
}

EDIT

无视-你不能使用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 Property (String)

您可以使用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;
        }
    }  
}

处理这种情况的另一种方法是异常处理。

每次调用不存在的值时,代码将从异常中恢复并继续循环。在catch块中,你可以像在else语句中一样处理错误,当表达式(…= null)返回false。当然,抛出和处理异常是一个相对昂贵的操作,根据性能要求,这可能不是理想的。