Avatar billede repsak Nybegynder
15. december 2004 - 00:17 Der er 3 kommentarer og
1 løsning

Læse XML out-memory

Jeg har en XML-fil med følgende format:
-----
<?xml version="1.0" encoding="utf-8" ?>
<fields>
    <syncfield>
        <name>Test</name>
        <allowInsert>true</allowInsert>
        <allowDelete>true</allowDelete>
    </syncfield>
    <syncfield>
        <name>Test2</name>
        <allowInsert>false</allowInsert>
        <allowDelete>true</allowDelete>
    </syncfield>
</fields>
------------

Hvordan læser jeg den mest optimalt når jeg
1) ikke vil opbevare læste data (altså out-memory)
2) ønsker at kunne tilgå et element med navnet

Har har en idé om at XPath er en mulig løsning?


Min idé:

XmlTextReader reader = new XmlTextReader(File.OpenRead(XmlRulesPath));
while(flere_syncfields){
  Console.WriteLine(aktuelt_syncfield_name);
  Console.WriteLine(aktuelt_syncfield_allowInsert);
  Console.WriteLine(aktuelt_syncfield_allowDelete);
}

Hvordan stiller jeg det op i kode?
Avatar billede arne_v Ekspert
15. december 2004 - 18:16 #1
Et par eksempler på henholdsvis in memory DOM træ og en sekventiel pull parsning:

using System;
using System.Xml;

namespace E4
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\field.xml");
            XmlNode field = doc.DocumentElement.SelectSingleNode("syncfield[name='Test']");
            foreach(XmlNode children in field.ChildNodes)
            {
                Console.WriteLine(children.Name + " = " + children.FirstChild.Value);
            }
        }
    }
}

og

using System;
using System.IO;
using System.Xml;

namespace E5
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            XmlTextReader xtr = new XmlTextReader(new StreamReader(@"C:\field.xml"));
            while(!xtr.EOF)
            {
                if(xtr.IsStartElement() && xtr.Name == "name")
                {
                    Console.WriteLine("name = " + xtr.ReadString());
                }
                if(xtr.IsStartElement() && xtr.Name == "allowInsert")
                {
                    Console.WriteLine("allowInsert = " + xtr.ReadString());
                }
                if(xtr.IsStartElement() && xtr.Name == "allowDelete")
                {
                    Console.WriteLine("allowDelete = " + xtr.ReadString());
                }
                xtr.Read();
            }
        }
    }
}
Avatar billede repsak Nybegynder
16. december 2004 - 20:33 #2
danke :-)
Avatar billede arne_v Ekspert
16. december 2004 - 21:25 #3
så vil jeg ligge et svar
Avatar billede repsak Nybegynder
16. december 2004 - 22:40 #4
fornuftigt ;-)
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