简体   繁体   English

检查Xml节点是否具有属性

[英]Check if Xml Node has an Attribute

How do I check if a node has particular attribute or not. 如何检查节点是否具有特定属性。

What I did is: 我做的是:

string referenceFileName = xmlFileName;
XmlTextReader textReader = new XmlTextReader(referenceFileName);

while (textReader.Read())
{
  XmlNodeType nType = textReader.NodeType;

  // if node type is an element
  if (nType == XmlNodeType.Element)
  {
    if (textReader.Name.Equals("Control"))
    {
      if (textReader.AttributeCount >= 1)
      {
        String val = string.Empty;
        val = textReader.GetAttribute("Visible");
        if (!(val == null || val.Equals(string.Empty)))
        {

        }
      }
    }
  }

Is there any function to check that a given attribute is present or not? 是否有任何功能来检查给定属性是否存在?

No, I don't think there is any method in XmlTextReader class which can tell you whether a particular attribute exists or not. 不,我不认为XmlTextReader类中有任何方法可以告诉您特定属性是否存在。

You can do one thing to check 你可以做一件事来检查

if(null == textReader.GetAttribute("Visible"))
{
   //this means attribute doesn't exist
}

because MSDN says about GetAttribute method 因为MSDN说的是GetAttribute方法

    Return the value of the specified attribute. If the attribute is not found,
 a null reference (Nothing in Visual Basic) is returned.

Found this: http://csharpmentor.blogspot.co.uk/2009/05/safely-retrive-attribute-from-xml-node.html 发现: http//csharpmentor.blogspot.co.uk/2009/05/safely-retrive-attribute-from-xml-node.html

You can convert the XmlNode to an XmlElement then use the HasAttribute method to check. 您可以将XmlNode转换为XmlElement,然后使用HasAttribute方法进行检查。 I just tried it and it works - very useful. 我只是尝试了它并且它有效 - 非常有用。

Sorry its not an example using your code - I'm in a hurry but hope it helps future askers! 对不起它不是一个使用你的代码的例子 - 我很着急,但希望它有助于未来的问题!

Try out LINQ-To-XML (query below might require minor fixes since I'm not have XML you are using) 试用LINQ-To-XML(下面的查询可能需要一些小修复,因为我没有你正在使用的XML)

XDocument xdoc = XDocument.Load("Testxml.xml");  

// It might be that Control element is a bit deeper in XML document
// hierarchy so if you was not able get it work please provide XML you are using
string value = xdoc.Descendants("Control")
                  .Where(d => d.HasAttributes
                              && d.Attribute("Visible") != null
                              && !String.IsNullOrEmpty(d.Attribute("Visible").Value))
                  .Select(d => d.Attribute("Visible").Value)
                  .Single();

//Check xml element value if exists using XmlReader //使用XmlReader检查xml元素值是否存在

      using (XmlReader xmlReader = XmlReader.Create(new StringReader("XMLSTRING")))
       {

           if (xmlReader.ReadToFollowing("XMLNODE")) 

            {
                string nodeValue = xmlReader.ReadElementString("XMLNODE");                
            }
        }     

Taking refernce from Harish's answer,following code worked for me 参考Harish的回答,以下代码为我工作

 XmlTextReader obj =new XmlTextReader("your path");
    //include @before"" if its local path
      while (obj.Read()) { 
      Console.WriteLine(obj.GetAttribute("name"));
      obj.MoveToNextAttribute();
      }

If anyone is not using a reader and just an XmlDocument try XmlAttributeCollection/XmlAttribute 如果有人不使用阅读器而只是一个XmlDocument尝试XmlAttributeCollection / XmlAttribute

XmlDocument doc = new XmlDocument();
try{
doc.Load(_indexFile);
    foreach(XmlNode node in doc.DocumentElement.ChildNodes){
        XmlAttributeCollection attrs = node.Attributes;
        foreach(XmlAttribute attr in attrs){
            Console.WriteLine(node.InnerText + ": " + attr.Name + " - " + attr.Value);
            if(attr.Name == "my-amazing-attribute")
            {
                //Do something with attribute
            }
        }
    }
}
} catch (Exception ex) {
    //Do something with ex
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM