0

Good Afternoon,

I was wondering if anyone had any ideas to shorten my process for writing a XML. At the moment I'm at a Alpha stage with this so its really a mock up. But I've realised i'm only 1/4 of the way though and there's so many lines of code!

I've wondered could i use the xsd file in VS2012 - but I get a tad confused. Plus I would need it to talk to a database which it will be linked to later on, and also have xml fields that repeat if necessary.

Another thing, anyone got an idea to state almost ...

if Field is null then 

not write xmlfield

Something like that!

Many thanks in advance, i'm open to suggestions - but I also don't expect you to code it all for me - just a gentle nudge and advise if there's a easier way of writing such a large amount of data.

Sub XML()

    Dim theDate As Date
    theDate = Now.Date
    Dim ymd As String = theDate.ToString("yyyyMMdd")

    Dim enc As System.Text.Encoding

    enc = System.Text.Encoding.GetEncoding("ISO-8859-1")

    Dim settings As XmlWriterSettings = New XmlWriterSettings

    settings.Indent = True
    settings.Encoding = enc

    Using writer As XmlWriter = XmlWriter.Create("C:\Test.xml", settings)
        writer.WriteStartDocument()
        writer.WriteDocType("ONIXMessage", Nothing, "http://www.editeur.org/onix/2.1/reference/onix-international.dtd", Nothing)

        writer.WriteStartElement("ONIXMessage")
        writer.WriteAttributeString("release", "2.1")

        writer.WriteStartElement("Header")

        ' write next element 
        writer.WriteStartElement("FromCompany")
        writer.WriteString(My.Settings.PublisherName)
        writer.WriteEndElement()

        '' write one more element 
        writer.WriteStartElement("FromPerson")
        writer.WriteString(My.Settings.ContactName)
        writer.WriteEndElement()

        writer.WriteStartElement("FromEmail")
        writer.WriteString(My.Settings.PublisherEmail)
        writer.WriteEndElement()

        writer.WriteStartElement("ToCompany")
        writer.WriteString("sono")
        writer.WriteEndElement()

        writer.WriteStartElement("SendDate")
        writer.WriteString(ymd)
        writer.WriteEndElement()

        writer.WriteEndElement()

        writer.WriteStartElement("Product")

        writer.WriteStartElement("RecordReference")
        writer.WriteString(Form1.ebinfoISBN.Text & "_" & My.Settings.PublisherName)
        writer.WriteEndElement()

        writer.WriteStartElement("NotificationType")
        writer.WriteString(Form1.ebinfoNotificationType.SelectedValue)
        writer.WriteEndElement()

        writer.WriteStartElement("ProductIdentifier")
        writer.WriteStartElement("ProductIDType")
        writer.WriteString("15")
        writer.WriteEndElement()
        writer.WriteStartElement("IDValue")
        writer.WriteString(Form1.ebinfoISBN.Text)
        writer.WriteEndElement()
        writer.WriteEndElement()

        writer.WriteStartElement("ProductForm")
        writer.WriteString("DG")
        writer.WriteEndElement()
        writer.WriteStartElement("EpubType")
        writer.WriteString(Form1.ebinfoEBFormat.SelectedValue)
        writer.WriteEndElement()

        writer.WriteStartElement("Title")

        writer.WriteStartElement("TitleType")
        writer.WriteString("01")
        writer.WriteEndElement()

        writer.WriteStartElement("TitleText")
        writer.WriteString(Form1.ebinfoTitle.Text)
        writer.WriteEndElement()

        writer.WriteStartElement("TitlePrefix")
        writer.WriteString(Form1.ebinfoTprefix.Text)
        writer.WriteEndElement()

        writer.WriteStartElement("Subtitle")
        writer.WriteString(Form1.ebinfoSTitle.Text)
        writer.WriteEndElement()

        writer.WriteEndDocument()

        writer.Close()

    End Using

End Sub
djv
  • 15,168
  • 7
  • 48
  • 72
Phillip Morton
  • 244
  • 2
  • 13
  • 6
    Yes - don't use `XmlWriter`. Use LINQ to XML to build up the whole document in memory. It'll be *much* simpler. You can even use XML literals in VB if you really want to. – Jon Skeet Jul 11 '13 at 14:01
  • Thanks Jon. Looks like a much better idea! I've included it as a reference now. Do you know how to push it out to a file by any chance? – Phillip Morton Jul 11 '13 at 14:09
  • Yes, you use `XDocument.Save`. – Jon Skeet Jul 11 '13 at 14:13
  • possible duplicate of [How do I write objects for easy XML Serialization in VB.NET?](http://stackoverflow.com/questions/223526/how-do-i-write-objects-for-easy-xml-serialization-in-vb-net) – djv Jul 11 '13 at 15:03
  • Don't think so, I'm looking to just export a file, not Serialise the data for settings :) – Phillip Morton Jul 11 '13 at 15:06
  • @PhillipBetts XML Serialization isn't just for settings. You can serialize any data you want for any reason you want. – Shaz Jul 26 '13 at 14:20

1 Answers1

0

I have found a way of doing this by using LINQ

Imports System.Xml
Imports System.Xml.Linq
Imports System.Linq

Dim documenttype = New XDocumentType("ONIXMessage", Nothing, "http://www.editeur.org/onix/2.1/reference/onix-international.dtd", Nothing)


    Dim Doc As New XDocument(documenttype)

    Doc = <?xml version="1.0" encoding="ISO-8859-1"?>


          <ONIXMessage release="2.1">
              <Header>
                  <FromCompany><%= My.Settings.Var %></FromCompany>
                  <FromPerson><%= My.Settings.VAR%></FromPerson>
                  <FromEmail><%= My.Settings.var%></FromEmail>
                  <ToCompany></ToCompany>
                  <SendDate><%= ymd %></SendDate>
              </Header>


   Doc.AddFirst(documenttype)
    Doc.Save("C:\Tester.xml")

And I can continue to write it out line by line, as it would read when viewing the XML file.

Phillip Morton
  • 244
  • 2
  • 13