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

Но я ошибаюсь, если условие проверяет только значение, а не наличие атрибутов. Как следует Я проверяю наличие атрибутов?

27
задан Peter Mortensen 16 December 2018 в 11:57
поделиться

4 ответа

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

foreach (XmlNode xNode in nodeListName)
{
  XmlNode parent = xNode.ParentNode;
  if (parent.Attributes != null
     && parent.Attributes["split"] != null)
  {
     parentSplit = parent.Attributes["split"].Value;
  }
}
42
ответ дан 28 November 2019 в 04:38
поделиться
var splitEle = xn.Attributes["split"];

if (splitEle !=null){
    return splitEle .Value;
}
3
ответ дан 28 November 2019 в 04:38
поделиться

Вы можете использовать LINQ & to nbsp; 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);
 }
7
ответ дан 28 November 2019 в 04:38
поделиться

Еще один способ справиться с ситуацией - это обработка исключений.

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

1
ответ дан 28 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: