Проверьте, есть ли у Xml Node атрибут

Как проверить, имеет ли node определенный атрибут или нет.

Что я сделал:

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)))
        {

        }
      }
    }
  }

Есть ли какая-либо функция для проверки наличия данного атрибута?

Ответ 1

Нет, я не думаю, что в классе XmlTextReader есть какой-либо метод, который может сказать вам, существует ли какой-либо конкретный атрибут.

Вы можете сделать одну вещь, чтобы проверить

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

потому что MSDN говорит о методе GetAttribute

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

Ответ 2

Найдено следующее: http://csharpmentor.blogspot.co.uk/2009/05/safely-retrive-attribute-from-xml-node.html

Вы можете преобразовать XmlNode в XmlElement, а затем использовать метод HasAttribute для проверки. Я просто попробовал, и он работает - очень полезно.

Извините, что это не пример вашего кода - я спешу, но надеюсь, что он поможет будущим айерам!

Ответ 3

Попробуйте 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();

Ответ 4

//Проверяем значение элемента xml, если оно существует с помощью XmlReader

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

           if (xmlReader.ReadToFollowing("XMLNODE")) 

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

Ответ 5

Принимая ответ от ответа Хариша, следующий код работал у меня

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

Ответ 6

Если кто-либо не использует читателя и просто 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
}