Avatar billede jpi Mester
08. juni 2018 - 14:35 Der er 3 kommentarer og
1 løsning

Formattering af stor XML fil

Jeg har brug for at få formatteret en stor XML-fil

Jeg har prøvet forskellige muligheder, men de kræver alle at hele filen indlæses i hukommelsen og derefter gemmes formatteret.
Det virker ikke da filen er for stor.

Er der en mulighed for at læse filen og skrive den formatteret "løbende" således at man slipper for at have det hele i hukommelsen?

På forhånd tak
Jacob
Avatar billede arne_v Ekspert
08. juni 2018 - 14:54 #1
XmlReader og XmlWriter burde kunne goere det.

Er formatet af XML filen kendt eller skal det vaere meget generisk?
Avatar billede arne_v Ekspert
08. juni 2018 - 15:27 #2
Generisk eksempel:


Imports System
Imports System.IO
Imports System.Xml

Namespace E
    Public Class Program
        Public Shared Sub Main(args As String())
            Using sw As New StreamWriter("\work\out.xml")
                Using sr As New StreamReader("\work\in.xml")
                    Dim xws As New XmlWriterSettings()
                    xws.Indent = True
                    Dim xw As XmlWriter = XmlWriter.Create(sw, xws)
                    xw.WriteStartDocument()
                    Dim xr As XmlReader = New XmlTextReader(sr)
                    While xr.Read()
                        Select Case xr.NodeType
                            Case XmlNodeType.Element
                                xw.WriteStartElement(xr.Name)
                                If xr.MoveToFirstAttribute() Then
                                    Do
                                        xw.WriteAttributeString(xr.Name, xr.Value)
                                    Loop While xr.MoveToNextAttribute()
                                End If
                                Exit Select
                            Case XmlNodeType.EndElement
                                xw.WriteEndElement()
                                Exit Select
                            Case XmlNodeType.Text
                                xw.WriteString(xr.Value)
                                Exit Select
                        End Select
                    End While
                    xr.Close()
                    xw.WriteEndDocument()
                    xw.Close()
                End Using
            End Using
        End Sub
    End Class
End Namespace
Avatar billede jpi Mester
11. juni 2018 - 11:56 #3
Hej
Det ser ret godt ud, men der er en fejl et sted og jeg kan ikke lige finde ud af hvor....

Hvis der er følgende XML <aaa><bbb /></aaa> bliver det "oversat" til
<aaa>
  <bbb />

Derefter starter den nye <aaa> og det hele bliver rykket en tand til højre.
Når der er flere af disse, så ender hele XML-koden med at stå godt til højre.
I slutningen af filen står så alle de manglende </aaa> tags.

En anden lille ting er at den fejler på start attributter.
Fejlen er "Invalid name character in 'xmlns:xsi'. The ':' character, hexadecimal value 0x3A, cannot be included in a name."
Her er start-tag'en inkl. attributter:
<AIXM-Snapshot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.website.com/schema.xsd" version="1" effective="2018-01-04T00:00:00" origin="XXX" created="2017-12-26T00:00:00">

Er det noget der kan rettes? Ellers kan jeg fjerne atributterne inden filen køres igennem din kode.
Avatar billede jpi Mester
11. juni 2018 - 14:57 #4
Jeg har løst problemet med indrykningen og den manglende </aaa> tag

Jeg tilføjede følgende linie lige før den første exit Select
If xr.IsEmptyElement Then xw.WriteEndElement()
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