Vb: Xml?

Nimm doch die Klasse XmlDocument.
C#:
XmlDocument doc = new XmlDocument();
doc.Load("myxml.xml");

XmlNode xn = doc.SelectSingleNode("/backup/settings/username");
if (xn != null)
  Console.WriteLine(xn.InnerText);
 
Hallo, Ich bekomme folgende "fehler-meldung" deren grund ich aber nicht nachvollziehen kann.
Token StartAttribute im Status Content würde in einem ungültigen XML-Dokument resultieren.
Das passiert immer wenn ich versuche einen Sub-Element ein Attribut hizuzufühgen (siehe Quellcode und gewünschte XML output)


Code:
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim xmlFileName As String = "J:\eBooks\report_" & DateAndTime.Now.ToShortDateString & ".xml" 'XML-Dateiname -> report_27.06.2011.xml
        Dim xw As New XmlTextWriter(xmlFileName, System.Text.Encoding.UTF8)
        xw.Formatting = Formatting.Indented

        Dim alle_dateien() As String, datei_typen() = {"*.pdf"} 'Dateitypen nach die gesucht werden soll
        Dim datei_type As String, datei As String
        '
        ' schleife durch alle Dateitypen
        '
        For Each datei_type In datei_typen
            Try
                'Lese alle Dateien aus dem Ordner...
                alle_dateien = Directory.GetFiles("J:\eBooks\", datei_type, SearchOption.AllDirectories)
                xw.WriteStartDocument()
                'Erstelle ROOT element für XML
                xw.WriteStartElement("ebooks")
                'Attribut COUNT für den ROOT-ELEMENT
                xw.WriteAttributeString("count", alle_dateien.Count.ToString)
                '
                ' Schleife durch alle_dateien Array
                '
                For Each datei In alle_dateien
                    lst_ebooks.Items.Add(datei)
                    Dim dateInfo As New FileInfo(datei) 'Datei-Informationen...
                    With xw
                        '<ebook>...
                        .WriteStartElement("ebook")
                        'Attribut für den <ebook> Element...
                        .WriteAttributeString("absolute_path", dateInfo.FullName.ToString)
                        'Erstelle einen Sub-Element <file>....
                        .WriteElementString("file", dateInfo.Name.ToString)
                        'sub-Element <size>
                        .WriteElementString("size", XmlConvert.ToString(System.Math.Round(dateInfo.Length / 1024, 2)))
                        'Attribut BYTES für sub-element <size>....
                        .WriteAttributeString("bytes", dateInfo.Length.ToString) '<- FEHLER! WARUM ?! 
                        .WriteElementString("created", dateInfo.CreationTime.ToShortDateString)
                        'xw.WriteAttributeString("datetime", dateInfo.CreationTime) <- AUCH FEHLER!
                        .WriteElementString("location", dateInfo.DirectoryName)
                        .WriteEndElement() '...</ebook>
                    End With
                Next
                'Schliesen den ROOT-Element
                xw.WriteEndElement()
                xw.Close()
            Catch ex As Exception
                MsgBox("Error : " & ex.Data.ToString & vbNewLine & "Message : " & ex.Message)
            End Try
        Next
    End Sub

Mein wunsch ist folgende XML Datei zu erstellen :
XML:
<?xml version="1.0" encoding="utf-8"?>
<ebooks count="494">
.....

  <ebook absolute_path="J:\eBooks\Apress - Pro ASP.NET 4 in VB 2010, Third Edition.Sep.2010.ENG.pdf">
    <file>Apress - Pro ASP.NET 4 in VB 2010, Third Edition.Sep.2010.ENG.pdf</file>
    <size bytes="40176052">40Mb</size>
    <created datetime="25.12.2010 12:48:52">25.12.2010</created>
    <location>J:\eBooks</location>
  </ebook>

<ebook absolute_path="J:\eBooks\Apress - Pro PHP and jQuery.Jun.2010.pdf">
    <file>Apress - Pro PHP and jQuery.Jun.2010.pdf</file>
    <size bytes="12523132">12.5Mb</size>
    <created datetime="10.07.2010 19:43:10">10.07.2010</created>
    <location>J:\eBooks</location>
  </ebook>
.....
</ebooks>

Fehler tritt imemr auf, wenn ich versuche den Elementen <size> und <created> einen Attribut zuzuweisen. Ich vermute, das wird mit jeden sub-element der <ebook> passieren. Versteh' aber nicht warum..und weiß nicht wie an meinen wunsch-output komme... Ideen ?
 
@Nico
Danke. Zwar habe ich die Antwort schon von paar tagen gefunden, aber trozdem Danke.

Ich habe volgende Code verwendet:
Code:
.WriteStartElement("size")
.WriteAttributeString("bytes", dateiInfo.Length.ToString)
.WriteString(Math.Round(dateiInfo.Length / 1048576, 2) & "Mb")
.WriteEndElement()

UPDATE:
das selbe Ergebniss mit Linq To XML....

Code:
Dim dir As DirectoryInfo = New DirectoryInfo("j:/ebooks/")
        Dim doc As XDocument = New XDocument(
            New XElement("ebooks", New XAttribute("count", dir.EnumerateFiles("*.pdf", SearchOption.AllDirectories).Count),
                From book In dir.GetFiles("*.pdf", SearchOption.AllDirectories)
                Order By book.LastAccessTime Descending
                Select New XElement("ebook", New XAttribute("absolute_path", book.FullName),
                       New XElement("file", book.Name),
                       New XElement("size", New XAttribute("bytes", book.Length), Math.Round(book.Length / 1048576, 2) & " Mb"),
                       New XElement("mtime", book.LastAccessTime.ToShortDateString),
                       New XElement("localtion", book.Directory))))
        doc.Save("xml_dump.xml")
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück