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
Susan Sarandonoriginal
2025-01-27 11:46:12295parcourir

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">

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

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

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

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

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:
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