Maison > développement back-end > C++ > Comment empêcher l'affichage d'attribut en double lors de l'analyse XML avec des attributs dans un C # TreeView?

Comment empêcher l'affichage d'attribut en double lors de l'analyse XML avec des attributs dans un C # TreeView?

Susan Sarandon
Libérer: 2025-01-27 11:46:12
original
316 Les gens l'ont consulté

How to Prevent Duplicate Attribute Display When Parsing XML with Attributes into a C# TreeView?

Recursion: Analyser le fichier XML avec des attributs dans TreeView dans C

Problème:

Analyser un fichier XML avec des attributs dans une vue en arbre dans les résultats C # Dans les attributs affichés plusieurs fois pour chaque nœud enfant qu'il a. Comment modifier le code pour s'assurer que les attributs ne sont affichés qu'une seule fois?

Exemple de fichier XML:

<?xml version="1.0" encoding="utf-8"?>
<DataConfiguration xmlns="abcefg12345" xmlns:xsi="12345abcefg" xsi:schemaLocation="12345abcefg12345abcefg">
  <Hosts>
    <Sites>
        <Site Name="ss">
            <Host Id="aa">
                <Address Host="www.www.com"></Address>
            </Host>
            <Host Id="ee">
                <Address Host="www.www.com"></Address>
            </Host>
            <Host Id="dd">
                <Address Host="www.www.com"></Address>
            </Host> 
            <Host Id="pp">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com/" />
            </Host>
            <Host Id="ss">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host> 
            <Host Id="561">
                <Address Host="www.www.com"></Address>
            </Host> 
        </Site>
        <Site Name="hihi">
            <Host Id="cc">
                <Address Host="www.www.com"></Address>
            </Host>
            <Host Id="sdD">
                <Address Host="www.www.com"></Address>
            </Host>
            <Host Id="8uj">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" /> 
            </Host>
            <Host Id="222">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />               
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host>             
        </Site>     
    </Sites>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host>         
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com" />
            </Host>

</Hosts>
<DataPools>
    <DataPool Id="sss" default="sure">
        <DataGroup Id="sss" Parent="aaa" UserCanSelectHost="sure">
            <HostId Parent="hhhh">I'm breaking here</HostId>
            <DataSources>
                <empty/>
            </DataSources>
        </DataGroup>
        <DataGroup Id="ccc" UserCanSelectHost="whynot">
            <HostId>God I'm breaking here again, i hope you can fix me</HostId>
            <DataSources>
                <empty/>
            </DataSources>
        </DataGroup>
        <DataGroup Id="sss" UserCanSelectHost="yessure">
            <HostId>cry face</HostId>
                <webfg displaygroup="sss" provider="sss">
Copier après la connexion

Solution:

Pour afficher les attributs d'un nœud uniquement Une fois, déplacez la boucle à travers les attributs hors de la boucle à travers les nœuds enfants.

private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
    // Loop through the XML nodes until the leaf is reached.
    // Add the nodes to the TreeView during the looping process.
    if (inXmlNode.HasChildNodes)
    {
        //Check if the XmlNode has attributes
        foreach (XmlAttribute att in inXmlNode.Attributes)
        {
            inTreeNode.Text = inTreeNode.Text + " " + att.Name + ": " + att.Value;
        }

        var nodeList = inXmlNode.ChildNodes;
        for (int i = 0; i < nodeList.Count; i++)
        {
            var xNode = inXmlNode.ChildNodes[i];
            var tNode = inTreeNode.Nodes[inTreeNode.Nodes.Add(new TreeNode(xNode.Name))];
            AddNode(xNode, tNode);
        }
    }
    else
    {
        // Here you need to pull the data from the XmlNode based on the
        // type of node, whether attribute values are required, and so forth.
        inTreeNode.Text = (inXmlNode.OuterXml).Trim();
    }
    treeView1.ExpandAll();
}
Copier après la connexion

Améliorations supplémentaires:

Filtrez des attributs d'espace de noms:

Si vous souhaitez supprimer l'affichage des attributs d'espace de noms, utilisez la méthode d'extension suivante:

public static class XmlNodeExtensions
{
    public static bool IsNamespaceDeclaration(this XmlAttribute attr)
    {
        if (attr == null)
            return false;
        if (attr.NamespaceURI != "http://www.w3.org/2000/xmlns/")
            return false;
        return attr.Name == "xmlns" || attr.Name.StartsWith("xmlns:");
    }
}
Copier après la connexion

et utilisez-la pour ignorer les instances XMLattributes indésirables:

foreach (var att in inXmlNode.Attributes.Cast<XmlAttribute>().Where(a => !a.IsNamespaceDeclaration()))
{
    inTreeNode.Text = inTreeNode.Text + " " + att.Name + ": " + att.Value;
}
Copier après la connexion

Affichage Texte d'attribut et d'élément sur tous les nœuds:

pour s'assurer que tous les nœuds affichent leur nom d'élément et les données d'attribut, pas seulement celles avec enfants, utilisent OUSERXML uniquement pour les nœuds de texte:

private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
    if (inXmlNode is XmlElement)
    {
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal