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?
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;
}
}
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;
}
}
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);
}
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;
}
}
var splitEle = xn.Attributes["split"];
if (splitEle !=null){
return splitEle .Value;
}
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.
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;
}
}
}