Avatar billede jens_bach Nybegynder
11. september 2006 - 22:13 Der er 12 kommentarer og
1 løsning

XML hvordan læser jeg dette

Hej..

er jeg helt galt på den eller hvordan burde jeg lave dette
og hvordan kan jeg læse der, er der en der kan lave et eksempel, jeg har læst http://www.eksperten.dk/artikler/499 og det er meget godt men jeg kan ikke få <Info> node's ud hvordan gør man ?

---------
<Setup>
  <andet info>
  </andet info>
  <mere andet info>
  </mere andet info>

  <WMI>
    <Info>
      <H1>Disk</H1>
      <WMI_string>select * from Win32_DiskDrive</WMI_string>
      <Data>
        <kollonne>
          <Name>Driv Navn</Name>
          <WMImane>Name</WMImane>
        </kollonne>
        <kollonne>
          <Name>Type</Name>
          <WMImane>Description</WMImane>
        </kollonne>
        <kollonne>
          <Name>VolumeName</Name>
          <WMImane>VolumeName</WMImane>
        </kollonne>
        <kollonne>
          <Name>Type</Name>
          <WMImane>Description</WMImane>
        </kollonne>
        <kollonne>
          <Name>FileSystem</Name>
          <WMImane>FileSystem</WMImane>
        </kollonne>
        <kollonne>
          <Name>Stoerlese</Name>
          <WMImane>Size</WMImane>
        </kollonne>
      </Data>
    </Info>
  </WMI>
</Setup>
---------
Avatar billede arne_v Ekspert
11. september 2006 - 22:17 #1
enten skal du kværne dig ned gennem strukturen med GetElementsByTagName og en masse
FirstChild etc.

eller så skal du skyde genvej med SelectNodes og XPath
Avatar billede spyrodrag Nybegynder
11. september 2006 - 22:28 #2
Har tilfældigvis lige en genial klasse til netop dette, havde brug for det samme for ikke så lang tid siden, under et projekt. Massere kommentarer :-)

using System;
using System.Collections.Generic;
using System.Text;

using System.Xml;

namespace Utils
{

    # region struct: Attribute
    /// <summary>
    /// Struktur til at holde styr på attributter, der er læst ud fra XML elementer.
    /// </summary>
    public struct Attribute
    {
        /// <summary>
        /// Navnet på denne attribut.
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        /// <summary>
        /// Værdien på denne attribut.
        /// </summary>
        public string Value
        {
            get { return this.value; }
            set { this.value = value; }
        }

        /// <summary>
        /// Gemmer navnet på denne attribut.
        /// </summary>
        private string name;

        /// <summary>
        /// Genner værdien på denne attribut.
        /// </summary>
        private string value;
    }
    #endregion

   
    #region class: FileEntry
    /// <summary>
    /// Klasse til at holde styr på alle de XML elementer der er blevet indlæst.
    /// </summary>
    public class FileEntry
    {
        /// <summary>
        /// Constructor til klassen "FileEntry".
        /// </summary>
        /// <param name="elementName">Navnet på det indlæste element.</param>
        public FileEntry(string elementName)
        {
            this.elementName = elementName;
        }

        /// <summary>
        /// Navnet på det element, som denne instans af "FileEntry" indeholder data fra.
        /// </summary>
        public string ElementName
        {
            get { return elementName; }
            set { elementName = value; }
        }

        /// <summary>
        /// Data, som ligger i dette element.
        /// </summary>
        public string Data
        {
            get { return data; }
            set { data = value; }
        }

        /// <summary>
        /// Attributter, som er angivet til dette element.
        /// </summary>
        public List<Attribute> Attributes
        {
            get { return attributes; }
            set { attributes = value; }
        }

        /// <summary>
        /// Gemmer navnet på elementet.
        /// </summary>
        private string elementName;

        /// <summary>
        /// Gemmer data, som findes i elementet.
        /// </summary>
        private string data;

        /// <summary>
        /// Gemmer attributterne, som findes i elementet.
        /// </summary>
        private List<Attribute> attributes = new List<Attribute>();
    }
    #endregion

    /// <summary>
    /// Klasse til at indlæse og skrive XML filer.
    /// </summary>
    public class XmlIO
    {
        /// <summary>
        /// Indlæser en scene fra en XML fil.
        /// </summary>
        /// <param name="filePath">Stien til den fil der skal indlæses scene fra.</param>
        /// <returns>En liste af elementer, der er læst ud fra filen.</returns>
        public List<FileEntry> LoadScene(string filePath)
        {
            // Opretter ny instans af XmlTextReader, som et filehandle til XML filen.
            XmlTextReader reader = new XmlTextReader(filePath);

            // Opretter ny instants af XmlDocument, bruges til behandling af XML elementer.
            XmlDocument document = new XmlDocument();
           
            // Indlæser XML filens elementer i document udfra reader.
            document.Load(reader);

            // Lukker readeren, den skal ikke bruges længere.
            reader.Close();

            // Gennemgår XML elementerne i document.
            ReadXml(document.DocumentElement);

            // Returnerer liste af FileEntry elementer.
            return fileData;
        }

        /// <summary>
        /// Rekursiv funktion til at læse XML dokument.
        /// </summary>
        /// <param name="node">Xml node, som skal læses.</param>
        private void ReadXml(XmlNode node)
        {
            // Hvis XML noden ikke indeholder data eller ikke findes, returnerer vi her.
            if (node == null) return;

            // Opretter nyt FileEntry og indsætter XML noden til dette.
            FileEntry entry = new FileEntry(node.Name);

            // Henter indhold imellem denne XML node.
            // Eksempelvis indhold imellem "scene", eller "description":
            // <scene>
            //  <description>my description</description>
            // </scene>
            entry.Data = node.InnerXml;

            // Hvis denne XML nodes type er et Element.
            // Et tag som kræver slut tag, eksempelvis:
            // <description>my description</description>
            if (node.NodeType == XmlNodeType.Element)
            {
                // Henter listen af attributter ud fra et givent element.
                // Eksempel: <scene param1="dd" param2="dd" />
                // Dette kan så finde param1 og param2, samt de tilhørende værdier.
                XmlNamedNodeMap attributes = node.Attributes;

                // Går igennem hver af de attributter, som blev fundet ovenfor.
                foreach (XmlNode attribute in attributes)
                {
                    // Opretter en ny attribut, som skal være en del af de returnerede data.
                    Attribute attrib = new Attribute();

                    // Gemmer navnet på attributten.
                    attrib.Name = attribute.Name;

                    // Gemmer værdien på attributten.
                    attrib.Value = attribute.Value;

                    // Gemmer attributten i listen over attributter, som høre til de enkelte
                    // elementer.
                    entry.Attributes.Add(attrib);
                }

                // Tilføjer de samlede data til listen over de returnerede data fra XML filen.
                // Dette entry indeholer både element, innerXml og attributter.
                fileData.Add(entry);
               
                // Har elementet nogen under elementer?
                if (node.HasChildNodes)
                {
                    // Gem undernoden.
                    XmlNode workingNode = node.FirstChild;

                    // Så længe den arbejdende node ikke er ingenting.
                    while (workingNode != null)
                    {
                        // Kalder denne rekursive funktion, med det nye underelement.
                        ReadXml(workingNode);

                        // Henter næste underelement i rækken.
                        workingNode = workingNode.NextSibling;
                    }
                }
            }
        }

        /// <summary>
        /// Gemmer listen over de fil data, som skal skrives eller læses.
        /// </summary>
        private List<FileEntry> fileData = new List<FileEntry>();
    }
}
Avatar billede spyrodrag Nybegynder
11. september 2006 - 22:32 #3
Lige et eksempel på benyttelse af klassen:
// Opret nyt objekt til at læse og skrive XML filer.
XmlIO io = new XmlIO();

// Indlæser data fra en bane.
List<FileEntry> entries = io.LoadScene(path);

// For hver FileEntry der er i listen over entries.
foreach (FileEntry entry in entries)
{
    // Tjekker på element navnet.
    switch (entry.ElementName)
    {
        // Hvis elementnavnet er "scene".
        case "scene":
            {
                // Gå igennem listen af attributter.
                foreach (Utils.Attribute attrib in entry.Attributes)
                {
                    // Hvis attributnavnet er "title".
                    if (attrib.Name == "title")
                    {
                        // Gem navnet på banen.
                        levelTitle = attrib.Value;

                        // Afslut foreach løkken.
                        break;
                    }
                }

                // Afslut switch sætningen.
                break;
            }
    }
}
Avatar billede jens_bach Nybegynder
11. september 2006 - 22:47 #4
har du den xml som du bruger ?
Avatar billede spyrodrag Nybegynder
11. september 2006 - 22:55 #5
Hej Jens.

Undskyld, havde ikke opdaget at du havde brug for en Visual Basic løsning. Dog kan jeg berolige dig med at syntaxen er næsten den samme. Så med en smule vilje, vil du sikkert kunne skrive koden om til Visual Basic. Det smarte ved ovenstående kode, er at den kan læse alle XML filer, og gemme dem i en struktur, som kan bruges i koden.

Den XML klasse, som der benyttes er Microsoft's. Du benytter den blot ved at tilføje en reference i Visual Studio.

Venlig hilsen,
Martin.
Avatar billede arne_v Ekspert
11. september 2006 - 22:58 #6
eksempel som fisker "Size" ud:

        Dim doc As XmlDocument = New XmlDocument
        doc.Load("C:\wmi.xml")
        Console.WriteLine(doc.SelectSingleNode("/Setup/WMI/Info/Data/kollonne[Name='Stoerlese']/WMImane").InnerXml)
Avatar billede arne_v Ekspert
11. september 2006 - 22:59 #7
PS: er det gået lidt hurtigt med den XML ? Der er vist en del stave fejl !
Avatar billede jens_bach Nybegynder
12. september 2006 - 00:13 #8
arne_v - 22:58> hvad så hvis jeg vil køre alle kollonne'r igemmen lige som

Dim kolonne As XmlNodeList = doc.GetElementsByTagName("kollonne")
            For Each knap As XmlNode In knaper

men det kan jeg jo ikke da det er uder <info> ??

-----------------------
arne_v - 22:59> ja det med stave fejl er en 'god' ting ;) nogle kan nået, jeg kan nået andet men mangler og finde ud af hvad ;)
Avatar billede arne_v Ekspert
12. september 2006 - 00:20 #9
jo da

        Dim doc As XmlDocument = New XmlDocument
        doc.Load("C:\wmi.xml")
        Dim kols As XmlNodeList = doc.GetElementsByTagName("kollonne")
        For Each kol As XmlNode In kols
            Console.WriteLine(kol.ChildNodes(0).FirstChild.Value & " " & kol.ChildNodes(1).FirstChild.Value)
        Next

virker fint
Avatar billede jens_bach Nybegynder
12. september 2006 - 09:02 #10
jo men føst vil jeg løbe alle <info> igemmen
dernest alle <kollonne>
Avatar billede arne_v Ekspert
12. september 2006 - 21:48 #11
Dim doc As XmlDocument = New XmlDocument
        doc.Load("C:\wmi.xml")
        Dim infos As XmlNodeList = doc.GetElementsByTagName("Info")
        For Each info As XmlElement In infos
            Dim kols As XmlNodeList = info.GetElementsByTagName("kollonne")
            For Each kol As XmlNode In kols
                Console.WriteLine(kol.ChildNodes(0).FirstChild.Value & " " & kol.ChildNodes(1).FirstChild.Value)
            Next
        Next

måske
Avatar billede arne_v Ekspert
05. oktober 2006 - 02:51 #12
OK ?
Avatar billede jens_bach Nybegynder
05. oktober 2006 - 21:54 #13
jeg har ikke prøvet det i nu .( men tak
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
Kurser inden for grundlæggende programmering

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



IT-JOB

Dansk Sygeplejeråd

IT-teknisk medarbejder

Netcompany A/S

IT Consultant

Capgemini Danmark A/S

Salesforce CTO - Nordics

ALD Automotive Danmark A/S

Regional IT-administrator