Gå til innhold

VB 2008: Slå sammen XML-filer, System.NullReferenceException-problem


Anbefalte innlegg

Hei,

nybegynner med VB skal lage et lite program for å åpne to eller flere .XML-filer fra en mappe, og slå sammen disse til én .XML-fil.

 

Utgangspunktet var at jeg fikk til en funksjon for å slå sammen to eller flere statiske xml-filer, men jeg ønsker å gjøre slik at jeg kan browse etter filer, og bruke funksjonen for å slå sammen disse.

 

Så langt har jeg kommet: Åpner filebrowser, legger til ønskede xml-filer i en ListBox, samt funksjonen for å slå sammen filene. Problemet ligger et sted i telleren som skal sørge for å legge til filene fra ListBox til slå-sammen-funksjonen (Button1_Click).

 

Her er hva jeg har så langt:

 

Public Class Form1

Dim TotalFile As String = ""

' Sub for Open File Dialog to open multiple files
Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click

	Dim OpenFileDialog1 As New OpenFileDialog

	OpenFileDialog1.Multiselect = True
	OpenFileDialog1.InitialDirectory = "C:\"
	OpenFileDialog1.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.*"
	OpenFileDialog1.FilterIndex = 2
	OpenFileDialog1.RestoreDirectory = True

	If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

		  For Each x As String In OpenFileDialog1.FileNames
			TotalFile = TotalFile & x & Environment.NewLine
			ListBox1.Items.Add(TotalFile)

		Next
		'MessageBox.Show(TotalFile)

	End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

	Dim i As Integer

	Dim doc1 As MSXML2.DOMDocument60

	doc1 = New MSXML2.DOMDocument60
	doc1.load(ListBox1.Items.Item(0))

	For i = 1 To Me.ListBox1.Items.Count - 1 Step 1

		Dim doc(i) As MSXML2.DOMDocument60

		Dim docNode(i) As MSXML2.IXMLDOMNode

		doc(i) = New MSXML2.DOMDocument60

		doc(i).load(ListBox1.Items.Item(i))

		'Neste linje gir System.NullReferenceException:
		 For Each docNode(i) In doc(i).documentElement.childNodes
			doc1.documentElement.appendChild(docNode(i))

		Next

	Next i
	doc1.save("C:\temp\merged.xml")
	'MsgBox(doc(i).xml)

End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

End Sub
End Class

 

Alle forslag mottas med takk, men husk at jeg er rimelig ny på det her, så jeg må ofte ha det inn med te-skje :cool:

 

Edit:

Det begynner for øvrig å gå opp for meg nå at det muligens har en sammenheng med hva jeg henter fra ListBox1 å gjøre... At det ikke ligger data fra filene som er lastet her, men kun en streng med path og filnavn.

Eventuelt så bruker jeg følgende setning i Button1_Click feil:

 

doc(i).load(ListBox1.Items.Item(i))

 

Hvordan skal jeg laste hver enkelt linje i ListBox1 til doc(i)?

Endret av tacoman
Lenke til kommentar
Videoannonse
Annonse

Trodde jeg hadde løst det, men det hadde jeg altså ikke.

Problemet ligger i å få lagt inn filene fra OpenFileDialog inn til ListBox1 korrekt.

Skjønner ikke hvordan jeg skal få til dette. Har fått til å legge til første valgte fil like mange ganger som antall filer man velger, men skulle jo gjerne fått lagt til hver enkelt fil da...

 

For Each fileName As String In OpenFileDialog1.FileNames
  ListBox1.Items.Add(OpenFileDialog1.FileName)

 

Hvordan får jeg lagt til alle filene fra OpenFileDialog til ListBox1?

Endret av tacoman
Lenke til kommentar

Fant ut av det til slutt :cool:

 

Fullstendig kode (som funker):

 

Imports System.IO

Public Class Form1

Dim TotalFile As String = ""

' Sub for Open File Dialog to open multiple files
Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click

	Dim OpenFileDialog1 As New OpenFileDialog

	OpenFileDialog1.Multiselect = True
	OpenFileDialog1.InitialDirectory = "C:\"
	OpenFileDialog1.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.*"
	OpenFileDialog1.FilterIndex = 2
	OpenFileDialog1.RestoreDirectory = True

	If OpenFileDialog1.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then

		For Each sFile As String In OpenFileDialog1.FileNames

			Dim pos As Integer = sFile.LastIndexOf("\"c)
			Me.ListBox1.Items.Add(System.IO.Path.GetFullPath(sFile))

		Next

	End If

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

	Dim i As Integer

	Dim doc1 As MSXML2.DOMDocument60

	doc1 = New MSXML2.DOMDocument60
	doc1.load(ListBox1.Items.Item(0))

	For i = 1 To Me.ListBox1.Items.Count - 1 Step 1

		Dim doc(i) As MSXML2.DOMDocument60

		Dim docNode(i) As MSXML2.IXMLDOMNode

		doc(i) = New MSXML2.DOMDocument60

		doc(i).load(ListBox1.Items.Item(i))

		For Each docNode(i) In doc(i).documentElement.childNodes
			doc1.documentElement.appendChild(docNode(i))

		Next

	Next i
	doc1.save("C:\temp\merged.xml")

End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

End Sub
End Class

 

:thumbup:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...