Avatar billede pfp Nybegynder
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
Avatar billede nielle Nybegynder
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);
                    }
                }
            }
        }
    }
}
Avatar billede aaberg Nybegynder
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.
Avatar billede nielle Nybegynder
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);
                }
            }
        }
    }
}
Avatar billede pfp Nybegynder
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?
Avatar billede nielle Nybegynder
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 :^)
Avatar billede pfp Nybegynder
27. februar 2006 - 11:48 #6
Det er da korrekt (jeg skal i øvrigt ikke bruge xml dokumentet efter noderne er læst)
Avatar billede aaberg Nybegynder
02. marts 2006 - 12:15 #7
svar. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester