39 votes

Comment vérifier si des attributs particuliers existent ou non dans le XML ?

Partie du contenu 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>

Je veux vérifier dans chaque nœud et si l'attribut split existe, essayez d'assigner une valeur d'attribut dans une variable.

Dans une boucle, j'essaie :

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

Mais je me trompe si la condition vérifie uniquement la valeur, et non l'existence des attributs. Comment dois-je vérifier l'existence des attributs ?

0 votes

Si cela n'était peut-être pas vrai à l'époque où cette question a été posée, il existe aujourd'hui une tendance à l'amélioration de la qualité de la vie. Méthode XmlElement.HasAttribute qui me semble bien adapté à ce type d'utilisation. Juste au cas où quelqu'un tomberait dessus...

54voto

Paul Points 1199

Vous pouvez en fait indexer directement dans la collection Attributs (si vous utilisez C# et non VB) :

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

4 votes

Lance une exception si le nœud a zéro attribut. Vous devez d'abord vérifier que la collection Attributs n'est pas nulle.

2 votes

Je suppose qu'il s'agit d'un nouveau sucre syntaxique : if (parent?.Attributes["split"] != null)

0 votes

Je penserais plutôt à if (parent.Attributes?["name"] != null)

13voto

Ben Points 856

Si votre code traite de XmlElements (plutôt que XmlNodes ) alors il existe la méthode XmlElement.HasAttribute(string name) .

Ainsi, si vous ne recherchez que des attributs sur des éléments (ce qui semble être le cas d'après le PO), il peut être plus robuste d'effectuer un casting en tant qu'élément, de vérifier s'il est nul, puis d'utiliser la méthode HasAttribute.

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

10voto

Pour les nouveaux venus, les versions récentes de C# permettent l'utilisation de ? opérateur pour vérifier les affectations nulles

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

7voto

AVD Points 57984

Vous pouvez utiliser 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())
    {

    }
}

OU

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

1 votes

+1 pour Linq to XML. Au lieu de Count() != 0, vous pourriez utiliser Any()

0 votes

@UrbanEsc - Juste par curiosité, y a-t-il un avantage à utiliser Any() plutôt que Count() ?

0 votes

Consultez ce sujet sur le SO stackoverflow.com/questions/305092/

5voto

user3423251 Points 41
var splitEle = xn.Attributes["split"];

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X