By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,984 Members | 1,388 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,984 IT Pros & Developers. It's quick & easy.

XML File - reading and writing

P: n/a
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.
Jun 12 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
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.PrimaryKe y)}

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" <ma**@nospam.comwrote in message
news:46***********************@news.zen.co.uk...
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.

Jun 12 '07 #2

P: n/a
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/
Jun 12 '07 #3

P: n/a
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.PrimaryKe y)}

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" <ma**@nospam.comwrote in message
news:46***********************@news.zen.co.uk...
>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.

Jun 12 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.