XML File - reading and writing

Discussion in 'ASP .Net' started by maw, Jun 12, 2007.

  1. maw

    maw Guest

    Hi, could somebody point me in the right direction for adding, removing
    and modifying nodes in an xml file programatically using vb.net (.net
    framework 2.0)? I have an xml file in the following format which I need
    to be able to add and remove records from. (I can not change this xml
    file format.)

    <country name="United Kingdom">
    <city name="City1">
    <street name="15 Street Address">
    <details>
    <postcode>POS COD</postcode>
    <province>County1</province>
    <c>GB</c>
    </details>
    </street>
    </city>
    <city name="City2">
    <street name="10 street address">
    <details>
    <postcode>PST COD</postcode>
    <province>County</province>
    <c>GB</c>
    </details>
    </street>
    </city>
    </country>


    I am having problems adding a node without overwriting existing data.
    For example I can determine if a Country already exists in the XML file
    but when I add the City and the Street items to it using the following
    code, it replaces existing city and street data in the xml file rather
    than appending new elements.

    Sub InsertAddress(ByVal doc As XmlDocument)
    Dim addresses As XmlNode = doc.DocumentElement
    Dim country As XmlElement

    If country_exists() Then
    'append
    country = doc.SelectSingleNode("//country[@name='Country']")
    Else
    country = doc.CreateElement("country")
    country.SetAttribute("name", "Spain")
    End If

    Dim city As XmlElement = doc.CreateElement("city")
    city.SetAttribute("name", "City3")

    Dim street As XmlElement = doc.CreateElement("street")
    street.SetAttribute("name", "20 Street Address")

    Dim details As XmlElement = doc.CreateElement("details")
    Dim postcode As XmlElement = doc.CreateElement("postcode")
    postcode.InnerText = "POS COD"

    Dim province As XmlElement = doc.CreateElement("province")
    province.InnerText = "County3"

    Dim c As XmlElement = doc.CreateElement("c")
    c.InnerText = "UK"

    country.AppendChild(city)
    city.AppendChild(street)
    street.AppendChild(details)
    details.AppendChild(postcode)
    details.AppendChild(province)
    details.AppendChild(c)
    addresses.AppendChild(country)
    End Sub


    Thanks for any help you can give.
    Mark.
     
    maw, Jun 12, 2007
    #1
    1. Advertising

  2. maw

    RSH Guest

    You can read the XML into a dataset and allow the user to work with that,
    saving the results back to XML. Loading and saving data from a dataset is
    quite simple and quite effective. In my opinion it is much easier to do
    this than work with the XML directly.

    Public Overrides Function GetDataSet() As System.Data.DataSet

    Dim fs As FileStream

    Try

    fs = New FileStream(MyBase.FilePath, FileMode.Open)

    MyBase.Dataset.ReadXml(fs)

    MyBase.Dataset.Tables(0).PrimaryKey = New DataColumn()
    {MyBase.Dataset.Tables(0).Columns(MyBase.PrimaryKey)}

    Return MyBase.Dataset

    Catch exc As Exception

    WriteToErrorLog(exc)

    Finally

    fs.Flush()

    fs.Close()

    End Try

    End Function

    Public Overrides Function SaveDataset(ByVal oDs As Dataset) As Boolean

    Dim fs As System.IO.StreamWriter

    Try

    oDs.WriteXml(MyBase.FilePath, XmlWriteMode.WriteSchema)

    fs = New System.IO.StreamWriter(MyBase.FilePath)

    oDs.WriteXml(fs, XmlWriteMode.WriteSchema)

    Catch exc As Exception

    WriteToErrorLog(exc)

    Finally

    fs.Flush()

    fs.Close()

    End Try

    End Function

    End Class

    Hope that helps,
    Ron

    "maw" <> wrote in message
    news:466e60e7$0$30330$...
    > Hi, could somebody point me in the right direction for adding, removing
    > and modifying nodes in an xml file programatically using vb.net (.net
    > framework 2.0)? I have an xml file in the following format which I need to
    > be able to add and remove records from. (I can not change this xml file
    > format.)
    >
    > <country name="United Kingdom">
    > <city name="City1">
    > <street name="15 Street Address">
    > <details>
    > <postcode>POS COD</postcode>
    > <province>County1</province>
    > <c>GB</c>
    > </details>
    > </street>
    > </city>
    > <city name="City2">
    > <street name="10 street address">
    > <details>
    > <postcode>PST COD</postcode>
    > <province>County</province>
    > <c>GB</c>
    > </details>
    > </street>
    > </city>
    > </country>
    >
    >
    > I am having problems adding a node without overwriting existing data. For
    > example I can determine if a Country already exists in the XML file but
    > when I add the City and the Street items to it using the following code,
    > it replaces existing city and street data in the xml file rather than
    > appending new elements.
    >
    > Sub InsertAddress(ByVal doc As XmlDocument)
    > Dim addresses As XmlNode = doc.DocumentElement
    > Dim country As XmlElement
    >
    > If country_exists() Then
    > 'append
    > country = doc.SelectSingleNode("//country[@name='Country']")
    > Else
    > country = doc.CreateElement("country")
    > country.SetAttribute("name", "Spain")
    > End If
    >
    > Dim city As XmlElement = doc.CreateElement("city")
    > city.SetAttribute("name", "City3")
    >
    > Dim street As XmlElement = doc.CreateElement("street")
    > street.SetAttribute("name", "20 Street Address")
    >
    > Dim details As XmlElement = doc.CreateElement("details")
    > Dim postcode As XmlElement = doc.CreateElement("postcode")
    > postcode.InnerText = "POS COD"
    >
    > Dim province As XmlElement = doc.CreateElement("province")
    > province.InnerText = "County3"
    >
    > Dim c As XmlElement = doc.CreateElement("c")
    > c.InnerText = "UK"
    >
    > country.AppendChild(city)
    > city.AppendChild(street)
    > street.AppendChild(details)
    > details.AppendChild(postcode)
    > details.AppendChild(province)
    > details.AppendChild(c)
    > addresses.AppendChild(country)
    > End Sub
    >
    >
    > Thanks for any help you can give.
    > Mark.
     
    RSH, Jun 12, 2007
    #2
    1. Advertising

  3. maw wrote:

    > I am having problems adding a node without overwriting existing data.
    > For example I can determine if a Country already exists in the XML file
    > but when I add the City and the Street items to it using the following
    > code, it replaces existing city and street data in the xml file rather
    > than appending new elements.
    >
    > Sub InsertAddress(ByVal doc As XmlDocument)
    > Dim addresses As XmlNode = doc.DocumentElement
    > Dim country As XmlElement
    >
    > If country_exists() Then
    > 'append
    > country = doc.SelectSingleNode("//country[@name='Country']")
    > Else
    > country = doc.CreateElement("country")
    > country.SetAttribute("name", "Spain")
    > End If
    >
    > Dim city As XmlElement = doc.CreateElement("city")
    > city.SetAttribute("name", "City3")
    >
    > Dim street As XmlElement = doc.CreateElement("street")
    > street.SetAttribute("name", "20 Street Address")
    >
    > Dim details As XmlElement = doc.CreateElement("details")
    > Dim postcode As XmlElement = doc.CreateElement("postcode")
    > postcode.InnerText = "POS COD"
    >
    > Dim province As XmlElement = doc.CreateElement("province")
    > province.InnerText = "County3"
    >
    > Dim c As XmlElement = doc.CreateElement("c")
    > c.InnerText = "UK"
    >
    > country.AppendChild(city)
    > city.AppendChild(street)
    > street.AppendChild(details)
    > details.AppendChild(postcode)
    > details.AppendChild(province)
    > details.AppendChild(c)
    > addresses.AppendChild(country)
    > End Sub


    With that code that does a lot of AppendChild calls you are only adding
    new nodes but you are certainly not able to overwrite stuff that way.
    So that code should work fine.


    --

    Martin Honnen --- MVP XML
    http://JavaScript.FAQTs.com/
     
    Martin Honnen, Jun 12, 2007
    #3
  4. maw

    mark Guest

    Thanks RSH, can I still use this method with the XML file structure I
    posted, i.e using attributes?

    RSH wrote:
    > You can read the XML into a dataset and allow the user to work with that,
    > saving the results back to XML. Loading and saving data from a dataset is
    > quite simple and quite effective. In my opinion it is much easier to do
    > this than work with the XML directly.
    >
    > Public Overrides Function GetDataSet() As System.Data.DataSet
    >
    > Dim fs As FileStream
    >
    > Try
    >
    > fs = New FileStream(MyBase.FilePath, FileMode.Open)
    >
    > MyBase.Dataset.ReadXml(fs)
    >
    > MyBase.Dataset.Tables(0).PrimaryKey = New DataColumn()
    > {MyBase.Dataset.Tables(0).Columns(MyBase.PrimaryKey)}
    >
    > Return MyBase.Dataset
    >
    > Catch exc As Exception
    >
    > WriteToErrorLog(exc)
    >
    > Finally
    >
    > fs.Flush()
    >
    > fs.Close()
    >
    > End Try
    >
    > End Function
    >
    > Public Overrides Function SaveDataset(ByVal oDs As Dataset) As Boolean
    >
    > Dim fs As System.IO.StreamWriter
    >
    > Try
    >
    > oDs.WriteXml(MyBase.FilePath, XmlWriteMode.WriteSchema)
    >
    > fs = New System.IO.StreamWriter(MyBase.FilePath)
    >
    > oDs.WriteXml(fs, XmlWriteMode.WriteSchema)
    >
    > Catch exc As Exception
    >
    > WriteToErrorLog(exc)
    >
    > Finally
    >
    > fs.Flush()
    >
    > fs.Close()
    >
    > End Try
    >
    > End Function
    >
    > End Class
    >
    > Hope that helps,
    > Ron
    >
    > "maw" <> wrote in message
    > news:466e60e7$0$30330$...
    >> Hi, could somebody point me in the right direction for adding, removing
    >> and modifying nodes in an xml file programatically using vb.net (.net
    >> framework 2.0)? I have an xml file in the following format which I need to
    >> be able to add and remove records from. (I can not change this xml file
    >> format.)
    >>
    >> <country name="United Kingdom">
    >> <city name="City1">
    >> <street name="15 Street Address">
    >> <details>
    >> <postcode>POS COD</postcode>
    >> <province>County1</province>
    >> <c>GB</c>
    >> </details>
    >> </street>
    >> </city>
    >> <city name="City2">
    >> <street name="10 street address">
    >> <details>
    >> <postcode>PST COD</postcode>
    >> <province>County</province>
    >> <c>GB</c>
    >> </details>
    >> </street>
    >> </city>
    >> </country>
    >>
    >>
    >> I am having problems adding a node without overwriting existing data. For
    >> example I can determine if a Country already exists in the XML file but
    >> when I add the City and the Street items to it using the following code,
    >> it replaces existing city and street data in the xml file rather than
    >> appending new elements.
    >>
    >> Sub InsertAddress(ByVal doc As XmlDocument)
    >> Dim addresses As XmlNode = doc.DocumentElement
    >> Dim country As XmlElement
    >>
    >> If country_exists() Then
    >> 'append
    >> country = doc.SelectSingleNode("//country[@name='Country']")
    >> Else
    >> country = doc.CreateElement("country")
    >> country.SetAttribute("name", "Spain")
    >> End If
    >>
    >> Dim city As XmlElement = doc.CreateElement("city")
    >> city.SetAttribute("name", "City3")
    >>
    >> Dim street As XmlElement = doc.CreateElement("street")
    >> street.SetAttribute("name", "20 Street Address")
    >>
    >> Dim details As XmlElement = doc.CreateElement("details")
    >> Dim postcode As XmlElement = doc.CreateElement("postcode")
    >> postcode.InnerText = "POS COD"
    >>
    >> Dim province As XmlElement = doc.CreateElement("province")
    >> province.InnerText = "County3"
    >>
    >> Dim c As XmlElement = doc.CreateElement("c")
    >> c.InnerText = "UK"
    >>
    >> country.AppendChild(city)
    >> city.AppendChild(street)
    >> street.AppendChild(details)
    >> details.AppendChild(postcode)
    >> details.AppendChild(province)
    >> details.AppendChild(c)
    >> addresses.AppendChild(country)
    >> End Sub
    >>
    >>
    >> Thanks for any help you can give.
    >> Mark.

    >
    >
     
    mark, Jun 12, 2007
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page