18. februar 2006 - 20:53
Der er
5 kommentarer og 2 løsninger
Læse elementnavn fra et vilkårligt xml dokument
Hej, Nogen der har et forslag til hvordan jeg kan få en liste over de distinkte element navne i et vilkårligt xml dokument. Eksempel: <adressebog> <kontakt> <navn>Peter</navn> </kontakt> <kontakt> <navn>Jens</navn> </kontakt> </adressebog> Skulle gerne give mig: adressebog, kontakt, navn Alle bud er velkomne :) /pfp
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
18. februar 2006 - 22:02
#1
Et bud: using System; using System.Xml; using System.Collections; namespace e689123 { class Program { static SortedList elementer = new SortedList(); static void Main(string[] args) { string xmlFileName = @"C:\Source.Net20\e689123\dinFil.xml"; XmlDocument doc = new XmlDocument(); doc.Load(xmlFileName); XmlElement root = doc.DocumentElement; ProcessXmlNode(root); foreach (string element in elementer.GetKeyList()) { Console.WriteLine(element); } } private static void ProcessXmlNode(XmlNode node) { string nodeName = node.Name; if (!nodeName.StartsWith("#")) { try { elementer.Add(nodeName, null); } catch (System.ArgumentException) { // For at undgå problemer med dubletter. } if (node.HasChildNodes) { foreach (XmlNode child in node.ChildNodes) { ProcessXmlNode(child); } } } } } }
18. februar 2006 - 22:30
#2
Jeg har et andet forslag: XmlTextReader reader = new XmlTextReader("filnavn.xml"); Dictionary<string, string> elements = new Dictionary<string, string>(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && !elements.ContainsKey(reader.LocalName)) { elements.Add(reader.LocalName, reader.LocalName); } } reader.Close(); foreach (string key in elements.Keys) { Console.WriteLine(elements[key]); } Hvis du bruger .NET 1.1 eller 1.0 kan du selvfølgelig ikke bruge en Generic Dictionary, da kan du bruge en Hashtable istedet.
19. februar 2006 - 08:35
#3
En noget mere stilren version af det første bud: using System; using System.Xml; using System.Collections; namespace e689123 { class Program { static SortedList elementer = new SortedList(); static void Main(string[] args) { string xmlFileName = @"C:\Source.Net20\e689123\dinFil.xml"; XmlDocument doc = new XmlDocument(); doc.Load(xmlFileName); XmlElement root = doc.DocumentElement; ProcessXmlNode(root); foreach (string element in elementer.GetKeyList()) { Console.WriteLine(element); } } private static void ProcessXmlNode(XmlNode node) { if (node.NodeType == XmlNodeType.Element) { string nodeName = node.Name; if (!elementer.ContainsKey(nodeName)) elementer.Add(nodeName, null); foreach (XmlNode child in node.ChildNodes) { ProcessXmlNode(child); } } } } }
26. februar 2006 - 23:19
#4
Tak for begge forslag. Jeg har anvendt aaberg's fordi der var færrest linier kode. Hvis det er okay med jer, kan i dele point?
27. februar 2006 - 09:55
#5
Nu er antallet af linjer måske ikke lige den sagligste grund for at vælge den ene løsning frem for den anden – den store forskel i antal linjer skyldes i øvrigt primært at jeg har en hel applikation, hvorimod aaberg80 kun har medtaget det væsentlige :^) Begrundelser for at vælge den ene frem for den anden: 1) Hvis du *ikke* skal bruge indholdet af XML-filen efterfølgende, bør du vælge aaberg80’s model; Den bruger mindst RAM, men hvis man skal spørge på nodes, eller man ønsker at manipulere dem skal man til at løbe igennem dem en gang til. 2) Hvis du skal bruge indholdet, f.eks. hvis du skal udtrække poster eller du ønsker at indsætte poster, eller hvad det nu kunne være, så bør du vælge min model. Men den bruger noget RAM idet at hele XML-filen loades til memory. ... og nej, jeg har intet imod at dele :^)
27. februar 2006 - 11:48
#6
Det er da korrekt (jeg skal i øvrigt ikke bruge xml dokumentet efter noderne er læst)
02. marts 2006 - 12:15
#7
svar. :-)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.