XmlWriter выбрасывает исключение с помощью XmlWriter.WriteAttributeString (токен SetAttribute -> недопустимый документ XML) - PullRequest
0 голосов
/ 27 июня 2011

Я пытаюсь создать файл 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>

Я написал следующий код VB.NET для достижения этого результата, но всегда получаю исключение относительно токена SetAttribute и недействительного документа XML.

Dim xmlFileName As String = "J:\eBooks\report_" & DateAndTime.Now.ToShortDateString & ".xml"
Dim xmlSetting As XmlWriterSettings = New XmlWriterSettings()
xmlSetting.Indent = True
Dim xw As XmlWriter = XmlWriter.Create(xmlFileName, xmlSetting)
...
...
dim singleFile as String
Dim myPdfFiles() as String = Directory.GetFiles(<path_to_dir>, <pdf_files>, SearchOption.AllDirectories)
Try
    xw.WriteStartDocument()
    xw.WriteStartElement("ebooks")
    xw.WriteAttributeString("count", myPdfFiles.Count.ToString)
    For Each singleFile In myPdfFiles
        Dim fi As New FileInfo(singleFile)
        With xw
            .WriteStartElement("ebook")
            .WriteAttributeString("absolute_path", fi.FullName.ToString)
            .WriteElementString("file", fi.Name.ToString)
            .WriteElementString("size", Math.Round(fi.Length / 1048576, 2) & "Mb")
            'Attribute BYTES for <size>....'
            .WriteAttributeString("bytes", fi.Length.ToString) '<- EXCEPTION!!!!'
            .WriteElementString("created", fi.CreationTime.ToShortDateString)
            'xw.WriteAttributeString("datetime", fi.CreationTime) <- would throw exception too'
            .WriteElementString("location", fi.DirectoryName)
            .WriteEndElement() '...close <ebook> element'
        End With
     Next
     xw.WriteEndElement() '..close <ebooks> element'
     xw.WriteEndDocument()
     xw.Flush()
     xw.Close()
Catch ex As Exception
    MsgBox("Message : " & ex.Message)
End Try

Есть идеи, почему я получаю исключение? Как получить XML-вывод, как указано выше?

1 Ответ

2 голосов
/ 27 июня 2011

XmlWriter.WriteElementString записывает элемент и значение . Это как использовать:

writer.WriteStartElement("name");
writer.WriteString("value");
writer.WriteEndElement();

Другими словами, это не оставляет вас внутри элемента, который вы создаете. Так что вместо этого:

.WriteElementString("size", Math.Round(fi.Length / 1048576, 2) & "Mb")
.WriteAttributeString("bytes", fi.Length.ToString)

Я думаю, что вы хотите:

.WriteStartElement("size")
.WriteAttributeString("bytes", fi.Length.ToString)
.WriteString(Math.Round(fi.Length / 1048576, 2) & "Mb")
.WriteEndElement()

Лично я предпочел бы создать все это в памяти, используя LINQ to XML, если только он не будет слишком большим. Как правило, это более простой API для работы.

...