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