XML File - reading and writing

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.
 
R

RSH

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.
 
M

Martin Honnen

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.
 
M

mark

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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,054
Latest member
LucyCarper

Latest Threads

Top