Подтвердить что ты не робот

Как проверить определенные атрибуты существуют или нет в 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>

Я хочу проверить каждый node, и если атрибут split существует, попробуйте присвоить значение атрибута переменной. внутри цикла .i try

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

Но я m wrong.if условие проверяет только значение не существование атрибутов. Как я должен проверить наличие атрибутов.

4b9b3361

Ответ 1

Фактически вы можете напрямую индексировать коллекцию атрибутов (если вы используете С#, а не VB):

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

Ответ 2

Если ваш код имеет дело с объектами 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;
  }
}

Ответ 3

Вы можете использовать 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("<br/>" +  t.Value);
    }

Ответ 4

ИЗМЕНИТЬ

Не принимать во внимание - вы не можете использовать ItemOf (это то, что я получаю для ввода, прежде чем тестировать). Я бы прочертил текст, если бы мог понять, как... или, может быть, я просто удалю ответ, потому что он был в конечном счете неправильным и бесполезным.

END EDIT

Вы можете использовать свойство ItemOf(string) в XmlAttributesCollection, чтобы узнать, существует ли атрибут. Он возвращает null, если он не найден.

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

Свойство XmlAttributeCollection.ItemOf(строка)

Ответ 5

Это старый вопрос, но все же стоит упомянуть о другом способе справиться с ситуацией, а именно об обработке исключений. Каждый раз, когда вызывается несуществующее значение, ваш код восстанавливается из исключения и просто продолжает цикл. В блоке catch вы можете обрабатывать ошибку так же, как вы ее записываете в свой else-statement, когда выражение (...!= Null) возвращает false. Конечно, бросание и обработка исключений - относительно дорогостоящая операция, которая может быть не идеальной в зависимости от требований к производительности.

Ответ 6

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

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