web-dev-qa-db-fra.com

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

Une 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 noeud et si l'attribut split existe, essayez d'attribuer une valeur d'attribut dans une variable.

Dans une boucle, j'essaye:

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, pas l'existence d'attributs. Comment devrais-je vérifier l'existence d'attributs?

22
Shree

Vous pouvez réellement indexer directement dans la collection Attributes (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;
  }
}
36
Paul

Si votre code traite avec des objets XmlElements (plutôt que XmlNodes), il existe la méthode XmlElement.HasAttribute (nom de chaîne) .

Par conséquent, si vous recherchez uniquement des attributs sur des éléments (comme dans l'OP), il peut être plus robuste de transtyper en tant qu'élément, recherchez la valeur null, puis utilisez 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;
  }
}
9
Ben

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

    }
}

OR

 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
adatapost

MODIFIER

Ignorez - vous ne pouvez pas utiliser ItemOf (c’est ce que j’ai pour taper avant de tester). Je barrerais le texte si je pouvais comprendre comment ... ou peut-être que je supprimerais simplement la réponse, puisque c'était finalement faux et inutile.

END EDIT

Vous pouvez utiliser la propriété ItemOf(string) dans XmlAttributesCollection pour voir si l'attribut existe. Il retourne null s'il n'est pas trouvé.

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

Propriété XmlAttributeCollection.ItemOf (String)

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

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

Une autre façon de gérer la situation est la gestion des exceptions.

Chaque fois qu'une valeur inexistante est appelée, votre code récupérera de l'exception et continuera simplement avec la boucle. Dans le bloc catch, vous pouvez gérer l'erreur de la même manière que vous l'écrivez dans votre instruction else lorsque l'expression (...! = Null) renvoie false. Bien sûr, lancer et gérer des exceptions est une opération relativement coûteuse qui peut ne pas être idéale en fonction des exigences de performances.

1
rbaleksandar

Vous pouvez utiliser la méthode GetNamedItem pour vérifier si l'attribut est disponible. Si null est renvoyé, il n'est pas disponible. Voici votre code avec cette vérification en place:

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