Avatar billede sholm Nybegynder
13. marts 2007 - 15:23 Der er 18 kommentarer og
2 løsninger

Læse fra XML-fil

Hej
Jeg har en xml fil jeg gerne skulle læse nogle informationer fra. Den kan se sådan her ud:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<ns2:VareListe xmlns:ns2="http://xxx">
    <Vare>
    <Beskrivelse></Beskrivelse>
    <Status></Status>
    <Pakning>
      <Status></Status>
      <Enhed></Enhed>
      <Vægt></Vægt>
    </Pakning>
    <Pakning>
      <Status></Status>
      <Enhed></Enhed>
      <Vægt></Vægt>
    </Pakning>
    </Vare>
</ns2:VareListe>

Der kan være 0 eller flere pakninger. Der er også mange flere felter i den aktuelle fil, men opbygningen er som den er vis her.

Nu vil jeg så gerne iterere gennem denne xml-fil og gøre et eller andet ved dataen i de enkelte felter. Hvordan gør man lige det nemmest? Er det et problem at der er flere der hedder <status>?

XML filen er forholdsvis stor (ca. 1GB) skal der tages specielt hensyn til dette så koden ikke ligger serveren ned?

Har du et godt link eller måske endda et kode eksempel vil det være super - VB eller C# er underordnet.
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 15:32 #1
Du bør bruge en xmlreader. Noget i denne stil:
using (XmlReader reader = XmlReader.Create("book3.xml")) {

while (reader.Read()) {
  if (reader.IsStartElement()) {
    if (reader.IsEmptyElement)
      Console.WriteLine("<{0}/>", reader.Name);
    else {
      Console.Write("<{0}> ", reader.Name);
      reader.Read(); // Read the start tag.
      if (reader.IsStartElement())  // Handle nested elements.
        Console.Write("\r\n<{0}>", reader.Name);
      Console.WriteLine(reader.ReadString());  //Read the text content of the element.
    }
  }
}
}
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 15:33 #2
Avatar billede softspot Forsker
13. marts 2007 - 15:33 #3
Prøv lige at lur på dette link: http://msdn2.microsoft.com/en-us/library/aa302289.aspx

Der står noget om hvordan man bruger en XmlReader og XmlWriter på store XML-filer...
Avatar billede kalp Novice
13. marts 2007 - 15:51 #4
Min metode er denne.. anvende en switch så crasher det ikke..

XmlDocument document = new XmlDocument();
document.LoadXml("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>
<ns2:VareListe xmlns:ns2=\"http://xxx\">
<Vare>
<Beskrivelse></Beskrivelse>
<Status></Status>
<Pakning>
<Status></Status>
<Enhed></Enhed>
<Vægt></Vægt>
</Pakning>
<Pakning>
<Status></Status>
<Enhed></Enhed>
<Vægt></Vægt>
</Pakning>
</Vare>
</ns2:VareListe>
");

XmlNodeList nodes = document.SelectNodes("//*");

foreach(XmlElement node in nodes)
{
  switch (node.Name)
        {
            case "Vare": { Console.WriteLine("Vare: "+ node.InnerText); } break;
            case "Beskrivelse": { Console.WriteLine("Beskrivelse: "+ node.InnerText); } break;
            case "Status": { Console.WriteLine("Status: "+ node.InnerText); } break;
                //osv.
        }
}
Avatar billede kalp Novice
13. marts 2007 - 15:52 #5
Hvis du henter en fil med xml skal du istedet anvende document.Load("sti til xml'en");
Avatar billede softspot Forsker
13. marts 2007 - 15:56 #6
qawi >> problemet med at indlæse hele XML-dokumentet i en DOM er at det kommer til at fylde op til 8 gange så meget som selve filen - og når den fylder 1 Gb, så skal der altså mere end normal meget hukommelse til for at det kan håndteres godt. Det er også derfor sholm beder om et alternativ... vil jeg tro :)
Avatar billede sholm Nybegynder
13. marts 2007 - 16:08 #7
tak for input jeg vil lige kigge nærmere på det
Avatar billede kalp Novice
13. marts 2007 - 16:12 #8
softspot >> jeg ved godt hvad problemet er, men det var mere for at lave et så "komplet" eksempel som muligt ud fra den info jeg fik:)
Avatar billede kalp Novice
13. marts 2007 - 16:14 #9
softspot >> og misforstod lidt det du mente tror jeg:-) og kan godt følge dig i det:P
Avatar billede softspot Forsker
13. marts 2007 - 16:15 #10
qawi >> OK, det lød bare så difinitivt det du skrev i indlæg'et fra 13/03-2007 15:52:08... :)
Avatar billede sholm Nybegynder
15. marts 2007 - 08:10 #11
dr_chaos >> Det virker rigtig godt med en xmlreader, jeg kan nemt gennemlæse hele filen uden det kræver specielt meget af serveren. Så tak for det hint :)

Nu til anden del: Jeg vil gerne læse filen igennem og pille hver vare ud og behandle den som xml, altså en vare ad gangen, nogle ideer til hvordan det gøres bedst? Jeg kan ikke lige dreje hvordan jeg kan se at her slutter en vare og en ny begynder?
Avatar billede dr_chaos Nybegynder
15. marts 2007 - 08:20 #12
Du kan evt gøre det at når du løber xml'en igennem, så kan oprettet en xml document i hukommelsen hvor du tilføjer indholdet af
<Vare> elementet.Det betyder at du tager det enkeltet vare element ud og behandler det i et selvstændigt xml document og derefter går videre til næste vare element.
Avatar billede dr_chaos Nybegynder
15. marts 2007 - 08:26 #13
du kan måske bruge noget med
using (XmlReader reader = XmlReader.Create("vare.xml")) {
    reader.ReadToFollowing("vare");
    do {
      //her laver du den nødvendige xml behandling;
    } while (reader.ReadToNextSibling("vare"));
}
Avatar billede sholm Nybegynder
15. marts 2007 - 08:35 #14
Det var også min tanke, men jeg kan ikke rigtig se hvordan jeg skal isolere et enkelt vare-element. Jeg er ude i noget med at benytte ReadOuterXml, men ved ikke lige om det er det jeg skal bruge - ja er meget ny indenfor xml :)

Noget ala.
Dim doc As XmlDocument
Dim reader As XmlReader = XmlReader.Create("c:\varer.xml")
Try
  While reader.Read()
    If reader.IsStartElement() Then
      If reader.IsEmptyElement Then
      Else
      doc = new XmlDocument
      doc = reader.ReadOuterXml
      'lav ting og sager med XmlDocument
      End If
    End If
  End While
Catch ex As Exception
Finally
reader.Dispose(True)
End Try

Vil dette mon give mig et vare-element? Tror jeg det vil, men ReadOuterXml returnerer en string som gerne skulle have været noget jeg kunne smide ind i et xmldocument :(
Avatar billede sholm Nybegynder
15. marts 2007 - 08:45 #15
doc.Load(reader.ReadOuterXml) måske :)
Avatar billede kalp Novice
15. marts 2007 - 08:49 #16
nej doc.XmlLoad()

og hvis ikke det er outxml må det være .ReadInnerXml())
Avatar billede dr_chaos Nybegynder
15. marts 2007 - 08:55 #17
noget med
while(reader.ReadToNextSibling("vare"))
{
XmlDocument doc = new XmlDocument();
doc.InnerXml = reader.ReadInnerXml();
}
Avatar billede sholm Nybegynder
15. marts 2007 - 10:15 #18
Så er det ved at være tæt på, dette virker:

Dim reader As XmlReader = XmlReader.Create("c:\Varer.xml")
Dim doc As XmlDocument
Dim nodes As XmlNodeList

Try
  reader.ReadToDescendant("Vare")
  Do
    doc = New XmlDocument()
    doc.InnerXml = reader.ReadOuterXml()
   
    nodes = doc.SelectNodes("//*")

    For Each node As XmlElement In nodes
      Select Case node.Name
        Case "Status"
          Me.Controls.Add(New LiteralControl(node.InnerText & "<br>"))
      End Select
    Next
  Loop Until reader.ReadToNextSibling("Vare") = False
 
Catch ex As Exception
  Me.Controls.Add(New LiteralControl(ex.Message))
Finally
'reader.Dispose()
End Try

Der er bare lige en lille hage at reader.Dispose() ikke kan køres da den er Protected? Nogen ide til hvordan jeg kan komme til at dispose min reader?

dr_chaos >> Smid lige et svar :)
Avatar billede dr_chaos Nybegynder
15. marts 2007 - 10:28 #19
svar :)
reader=null måske.
Avatar billede sholm Nybegynder
15. marts 2007 - 10:52 #20
Tak for hjælpen!
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