XML File - reading and writing

  • Thread starter Thread starter maw
  • Start date Start date
M

maw

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.
 
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 said:
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 said:
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.
 
Thanks RSH, can I still use this method with the XML file structure I
posted, i.e using attributes?
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 said:
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.
 
Back
Top