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

时间:2011-08-25 07:50:07

标签: c# xml

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

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

8 个答案:

答案 0 :(得分:40)

您实际上可以直接索引到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;
  }
}

答案 1 :(得分:8)

如果您的代码正在处理XmlElements个对象(而不是XmlNodes),那么就会有方法XmlElement.HasAttribute(string name)

因此,如果您只是在元素上寻找属性(从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;
  }
}

答案 2 :(得分:7)

您可以使用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())
    {

    }
}

OR

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

答案 3 :(得分:4)

仅供新手使用:最新版本的C#允许使用?运算符检查空值分配

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

答案 4 :(得分:3)

修改

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

答案 5 :(得分:2)

var splitEle = xn.Attributes["split"];

if (splitEle !=null){
    return splitEle .Value;
}

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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