I am trying to insert a node into an XMLFile. using XMLTextwriter. My
Question is
Is it possible to do without using XMLDocument. Because its loading all the
the file into memory. I just want to insert in the front. My code is give
below.
Is it possible to do without using XMLDOcument?
Dim masterDoc As String = Request.Physica lApplicationPat h & "PageViews. xml"
Dim writer As XmlTextWriter = Nothing
Dim sb As StringBuilder = Nothing
Dim sw As StringWriter = Nothing
Try
'define variables
sb = New StringBuilder
sw = New StringWriter(sb )
writer = New XmlTextWriter(s w)
'build xml object
writer.Formatti ng = Formatting.Inde nted
writer.WriteSta rtElement("Requ est", Nothing)
writer.WriteEle mentString("Pag eAccessed",
Request.ServerV ariables("URL") )
writer.WriteEle mentString("Que ryString",
Request.ServerV ariables("QUERY _STRING"))
writer.WriteEle mentString("IPA ddress",
Request.ServerV ariables("REMOT E_ADDR"))
writer.WriteEle mentString("Ref erer",
Request.ServerV ariables("HTTP_ REFERER"))
writer.WriteEle mentString("Use rAgent",
Request.ServerV ariables("HTTP_ USER_AGENT"))
writer.WriteEle mentString("Dat e", Date.Now)
writer.WriteEnd Element()
writer.Flush()
'make fragment
Dim doc As XmlDocument = New XmlDocument
doc.LoadXml(sb. ToString())
Dim frag As XmlDocumentFrag ment = doc.CreateDocum entFragment()
Dim node As XmlNode
For Each node In doc.ChildNodes
frag.AppendChil d(node)
Next
'add fragment to xml file
doc.Load(master Doc)
doc.DocumentEle ment.PrependChi ld(frag)
doc.Save(master Doc)
writer.Close()
sw.Close()
Catch ex As Exception
Response.Write( "can't do it: " + ex.Message)
Finally
If Not writer Is Nothing Then
writer.Close()
End If
If Not sw Is Nothing Then
sw.Close()
End If
End Try
Thank You
Reddy 5 6139
No. Think about what the system would have to do to insert content into the
middle of some text. First it has to locate the position (the front is
relatively easy to locate). It then has to push the existing content out of
the way. This requires the allocation of more file space and the moving of
each character on position to the right. Finally it inserts what you need.
Essentially it would have to load the entire document in memory just to
shuffle around the characters (even without the DOM) by using parse methods.
The text writers are forward only and do not interact with what is already
in the stream, meaning that it would probably overwrite the contents that
are already there.
"reddy" <re***@discussi ons.microsoft.c om> wrote in message
news:63******** *************** ***********@mic rosoft.com... I am trying to insert a node into an XMLFile. using XMLTextwriter. My Question is Is it possible to do without using XMLDocument. Because its loading all
the the file into memory. I just want to insert in the front. My code is give below. Is it possible to do without using XMLDOcument?
Dim masterDoc As String = Request.Physica lApplicationPat h &
"PageViews. xml" Dim writer As XmlTextWriter = Nothing Dim sb As StringBuilder = Nothing Dim sw As StringWriter = Nothing
Try 'define variables sb = New StringBuilder sw = New StringWriter(sb ) writer = New XmlTextWriter(s w)
'build xml object writer.Formatti ng = Formatting.Inde nted writer.WriteSta rtElement("Requ est", Nothing) writer.WriteEle mentString("Pag eAccessed", Request.ServerV ariables("URL") ) writer.WriteEle mentString("Que ryString", Request.ServerV ariables("QUERY _STRING")) writer.WriteEle mentString("IPA ddress", Request.ServerV ariables("REMOT E_ADDR")) writer.WriteEle mentString("Ref erer", Request.ServerV ariables("HTTP_ REFERER")) writer.WriteEle mentString("Use rAgent", Request.ServerV ariables("HTTP_ USER_AGENT")) writer.WriteEle mentString("Dat e", Date.Now)
writer.WriteEnd Element() writer.Flush()
'make fragment Dim doc As XmlDocument = New XmlDocument doc.LoadXml(sb. ToString()) Dim frag As XmlDocumentFrag ment = doc.CreateDocum entFragment() Dim node As XmlNode For Each node In doc.ChildNodes frag.AppendChil d(node) Next
'add fragment to xml file doc.Load(master Doc) doc.DocumentEle ment.PrependChi ld(frag)
doc.Save(master Doc)
writer.Close() sw.Close() Catch ex As Exception Response.Write( "can't do it: " + ex.Message) Finally If Not writer Is Nothing Then writer.Close() End If If Not sw Is Nothing Then sw.Close() End If End Try
Thank You Reddy
Thank you for the reply Peter. So you are saying I have to use XMLDocument.
Actually i want to keep that code in global.asax file to track the requests
to our webserver.
Do you think is this going to effect the performance because of this DOM?
Right now i am testing. It's working fine. But once i keep it in production
i fear about the performance issues.
"Peter Rilling" wrote: No. Think about what the system would have to do to insert content into the middle of some text. First it has to locate the position (the front is relatively easy to locate). It then has to push the existing content out of the way. This requires the allocation of more file space and the moving of each character on position to the right. Finally it inserts what you need. Essentially it would have to load the entire document in memory just to shuffle around the characters (even without the DOM) by using parse methods. The text writers are forward only and do not interact with what is already in the stream, meaning that it would probably overwrite the contents that are already there.
"reddy" <re***@discussi ons.microsoft.c om> wrote in message news:63******** *************** ***********@mic rosoft.com... I am trying to insert a node into an XMLFile. using XMLTextwriter. My Question is Is it possible to do without using XMLDocument. Because its loading all the the file into memory. I just want to insert in the front. My code is give below. Is it possible to do without using XMLDOcument?
Dim masterDoc As String = Request.Physica lApplicationPat h & "PageViews. xml" Dim writer As XmlTextWriter = Nothing Dim sb As StringBuilder = Nothing Dim sw As StringWriter = Nothing
Try 'define variables sb = New StringBuilder sw = New StringWriter(sb ) writer = New XmlTextWriter(s w)
'build xml object writer.Formatti ng = Formatting.Inde nted writer.WriteSta rtElement("Requ est", Nothing) writer.WriteEle mentString("Pag eAccessed", Request.ServerV ariables("URL") ) writer.WriteEle mentString("Que ryString", Request.ServerV ariables("QUERY _STRING")) writer.WriteEle mentString("IPA ddress", Request.ServerV ariables("REMOT E_ADDR")) writer.WriteEle mentString("Ref erer", Request.ServerV ariables("HTTP_ REFERER")) writer.WriteEle mentString("Use rAgent", Request.ServerV ariables("HTTP_ USER_AGENT")) writer.WriteEle mentString("Dat e", Date.Now)
writer.WriteEnd Element() writer.Flush()
'make fragment Dim doc As XmlDocument = New XmlDocument doc.LoadXml(sb. ToString()) Dim frag As XmlDocumentFrag ment = doc.CreateDocum entFragment() Dim node As XmlNode For Each node In doc.ChildNodes frag.AppendChil d(node) Next
'add fragment to xml file doc.Load(master Doc) doc.DocumentEle ment.PrependChi ld(frag)
doc.Save(master Doc)
writer.Close() sw.Close() Catch ex As Exception Response.Write( "can't do it: " + ex.Message) Finally If Not writer Is Nothing Then writer.Close() End If If Not sw Is Nothing Then sw.Close() End If End Try
Thank You Reddy
I think it'd be better performance-wise to create the xml as a plain string,
and then try to append it at the end of the document without too many string
operations ( for finding the end tag of the xml for example ... )
Fro instance, if you know the exact size of your end-line in bytes, you
could just open the file as a strem, move the file pointer just before the
end-line, and write your xml (string) content there very fast ...
You see, loading a doc into an XmlDocument not only opens & reads the file
into memory, but also performs the full parsing & object(s) creation
required for DOM objects ... which could be a serious performance killer in
an xml file with a few thousand elements.
Angel
O:]
"reddy" <re***@discussi ons.microsoft.c om> wrote in message
news:95******** *************** ***********@mic rosoft.com... Thank you for the reply Peter. So you are saying I have to use
XMLDocument. Actually i want to keep that code in global.asax file to track the
requests to our webserver.
Do you think is this going to effect the performance because of this DOM? Right now i am testing. It's working fine. But once i keep it in
production i fear about the performance issues.
"Peter Rilling" wrote:
No. Think about what the system would have to do to insert content into
the middle of some text. First it has to locate the position (the front is relatively easy to locate). It then has to push the existing content
out of the way. This requires the allocation of more file space and the moving
of each character on position to the right. Finally it inserts what you
need. Essentially it would have to load the entire document in memory just to shuffle around the characters (even without the DOM) by using parse
methods. The text writers are forward only and do not interact with what is
already in the stream, meaning that it would probably overwrite the contents
that are already there.
"reddy" <re***@discussi ons.microsoft.c om> wrote in message news:63******** *************** ***********@mic rosoft.com... I am trying to insert a node into an XMLFile. using XMLTextwriter. My Question is Is it possible to do without using XMLDocument. Because its loading
all the the file into memory. I just want to insert in the front. My code is
give below. Is it possible to do without using XMLDOcument?
Dim masterDoc As String = Request.Physica lApplicationPat h & "PageViews. xml" Dim writer As XmlTextWriter = Nothing Dim sb As StringBuilder = Nothing Dim sw As StringWriter = Nothing
Try 'define variables sb = New StringBuilder sw = New StringWriter(sb ) writer = New XmlTextWriter(s w)
'build xml object writer.Formatti ng = Formatting.Inde nted writer.WriteSta rtElement("Requ est", Nothing) writer.WriteEle mentString("Pag eAccessed", Request.ServerV ariables("URL") ) writer.WriteEle mentString("Que ryString", Request.ServerV ariables("QUERY _STRING")) writer.WriteEle mentString("IPA ddress", Request.ServerV ariables("REMOT E_ADDR")) writer.WriteEle mentString("Ref erer", Request.ServerV ariables("HTTP_ REFERER")) writer.WriteEle mentString("Use rAgent", Request.ServerV ariables("HTTP_ USER_AGENT")) writer.WriteEle mentString("Dat e", Date.Now)
writer.WriteEnd Element() writer.Flush()
'make fragment Dim doc As XmlDocument = New XmlDocument doc.LoadXml(sb. ToString()) Dim frag As XmlDocumentFrag ment =
doc.CreateDocum entFragment() Dim node As XmlNode For Each node In doc.ChildNodes frag.AppendChil d(node) Next
'add fragment to xml file doc.Load(master Doc) doc.DocumentEle ment.PrependChi ld(frag)
doc.Save(master Doc)
writer.Close() sw.Close() Catch ex As Exception Response.Write( "can't do it: " + ex.Message) Finally If Not writer Is Nothing Then writer.Close() End If If Not sw Is Nothing Then sw.Close() End If End Try
Thank You Reddy
Thank You Angelos.
Your idea of using plain string sounds good. But I need to insert child
node right, so I am not exactly appending. Kind of inserting that node
infornt of end of root node.
I didn't quite get ur idea of "the exact size of your end-line in bytes".
Could you please explain a little bit more.
Thank you very much
Reddy
"Angelos Karantzalis" wrote: I think it'd be better performance-wise to create the xml as a plain string, and then try to append it at the end of the document without too many string operations ( for finding the end tag of the xml for example ... )
Fro instance, if you know the exact size of your end-line in bytes, you could just open the file as a strem, move the file pointer just before the end-line, and write your xml (string) content there very fast ...
You see, loading a doc into an XmlDocument not only opens & reads the file into memory, but also performs the full parsing & object(s) creation required for DOM objects ... which could be a serious performance killer in an xml file with a few thousand elements.
Angel O:]
"reddy" <re***@discussi ons.microsoft.c om> wrote in message news:95******** *************** ***********@mic rosoft.com... Thank you for the reply Peter. So you are saying I have to use XMLDocument. Actually i want to keep that code in global.asax file to track the requests to our webserver.
Do you think is this going to effect the performance because of this DOM? Right now i am testing. It's working fine. But once i keep it in production i fear about the performance issues.
"Peter Rilling" wrote:
No. Think about what the system would have to do to insert content into the middle of some text. First it has to locate the position (the front is relatively easy to locate). It then has to push the existing content out of the way. This requires the allocation of more file space and the moving of each character on position to the right. Finally it inserts what you need. Essentially it would have to load the entire document in memory just to shuffle around the characters (even without the DOM) by using parse methods. The text writers are forward only and do not interact with what is already in the stream, meaning that it would probably overwrite the contents that are already there.
"reddy" <re***@discussi ons.microsoft.c om> wrote in message news:63******** *************** ***********@mic rosoft.com... > I am trying to insert a node into an XMLFile. using XMLTextwriter. My > Question is > Is it possible to do without using XMLDocument. Because its loading all the > the file into memory. I just want to insert in the front. My code is give > below. > Is it possible to do without using XMLDOcument? > > > Dim masterDoc As String = Request.Physica lApplicationPat h & "PageViews. xml" > Dim writer As XmlTextWriter = Nothing > Dim sb As StringBuilder = Nothing > Dim sw As StringWriter = Nothing > > Try > 'define variables > sb = New StringBuilder > sw = New StringWriter(sb ) > writer = New XmlTextWriter(s w) > > 'build xml object > writer.Formatti ng = Formatting.Inde nted > writer.WriteSta rtElement("Requ est", Nothing) > writer.WriteEle mentString("Pag eAccessed", > Request.ServerV ariables("URL") ) > writer.WriteEle mentString("Que ryString", > Request.ServerV ariables("QUERY _STRING")) > writer.WriteEle mentString("IPA ddress", > Request.ServerV ariables("REMOT E_ADDR")) > writer.WriteEle mentString("Ref erer", > Request.ServerV ariables("HTTP_ REFERER")) > writer.WriteEle mentString("Use rAgent", > Request.ServerV ariables("HTTP_ USER_AGENT")) > writer.WriteEle mentString("Dat e", Date.Now) > > writer.WriteEnd Element() > writer.Flush() > > 'make fragment > Dim doc As XmlDocument = New XmlDocument > doc.LoadXml(sb. ToString()) > Dim frag As XmlDocumentFrag ment = doc.CreateDocum entFragment() > Dim node As XmlNode > For Each node In doc.ChildNodes > frag.AppendChil d(node) > Next > > 'add fragment to xml file > doc.Load(master Doc) > doc.DocumentEle ment.PrependChi ld(frag) > > doc.Save(master Doc) > > writer.Close() > sw.Close() > Catch ex As Exception > Response.Write( "can't do it: " + ex.Message) > Finally > If Not writer Is Nothing Then > writer.Close() > End If > If Not sw Is Nothing Then > sw.Close() > End If > End Try > > > Thank You > Reddy
Say your xml starts with "<log>" and that's where you want to insert the new
data.
You've two options:
1) Work with strings, i.e. load the file as a string in memory and
"play-around" with that.
2) Use streams to make things a little faster.
In the first case, you know that you want to insert 5 characters after the
start of the document, so things are pretty straight-forward. cut the string
in two, insert the new xml where it's supposed to be, join the strings again
& save to disk.
In the second case, you pretty much need to do the same operations, only
you're working with streams - bytes in other words. So, you need to know how
many bytes from the start of the document you want to insert the new xml in
as a byte[] ... so, you need to "translate" the length of your first ( I
though it was the last in my previous post ) line from characters to bytes.
The second (stream-based) way is actually a bit more complex from a coding
perspective, but, if implemented properly, it will cut-down much on memory
usage & processing speed. You won't have to parse the whole document in
memory. But it will give you some trouble because you'll have to read the
complete stream byte-by-byte and write it out another stream adding the
extra content (possibly in a new 'temp' file that you'll have to swap with
the original after all the reading/writing's completed )
That's it, i think :) Have fun coding !!!
Angel
O:]
"reddy" <re***@discussi ons.microsoft.c om> wrote in message
news:89******** *************** ***********@mic rosoft.com... Thank You Angelos. Your idea of using plain string sounds good. But I need to insert child node right, so I am not exactly appending. Kind of inserting that node infornt of end of root node. I didn't quite get ur idea of "the exact size of your end-line in bytes". Could you please explain a little bit more.
Thank you very much Reddy
"Angelos Karantzalis" wrote:
I think it'd be better performance-wise to create the xml as a plain
string, and then try to append it at the end of the document without too many
string operations ( for finding the end tag of the xml for example ... )
Fro instance, if you know the exact size of your end-line in bytes, you could just open the file as a strem, move the file pointer just before
the end-line, and write your xml (string) content there very fast ...
You see, loading a doc into an XmlDocument not only opens & reads the
file into memory, but also performs the full parsing & object(s) creation required for DOM objects ... which could be a serious performance killer
in an xml file with a few thousand elements.
Angel O:]
"reddy" <re***@discussi ons.microsoft.c om> wrote in message news:95******** *************** ***********@mic rosoft.com... Thank you for the reply Peter. So you are saying I have to use XMLDocument. Actually i want to keep that code in global.asax file to track the requests to our webserver.
Do you think is this going to effect the performance because of this
DOM? Right now i am testing. It's working fine. But once i keep it in production i fear about the performance issues.
"Peter Rilling" wrote:
> No. Think about what the system would have to do to insert content
into the > middle of some text. First it has to locate the position (the front
is > relatively easy to locate). It then has to push the existing
content out of > the way. This requires the allocation of more file space and the
moving of > each character on position to the right. Finally it inserts what
you need. > Essentially it would have to load the entire document in memory just
to > shuffle around the characters (even without the DOM) by using parse methods. > The text writers are forward only and do not interact with what is already > in the stream, meaning that it would probably overwrite the contents that > are already there. > > > "reddy" <re***@discussi ons.microsoft.c om> wrote in message > news:63******** *************** ***********@mic rosoft.com... > > I am trying to insert a node into an XMLFile. using XMLTextwriter.
My > > Question is > > Is it possible to do without using XMLDocument. Because its
loading all > the > > the file into memory. I just want to insert in the front. My code
is give > > below. > > Is it possible to do without using XMLDOcument? > > > > > > Dim masterDoc As String = Request.Physica lApplicationPat h & > "PageViews. xml" > > Dim writer As XmlTextWriter = Nothing > > Dim sb As StringBuilder = Nothing > > Dim sw As StringWriter = Nothing > > > > Try > > 'define variables > > sb = New StringBuilder > > sw = New StringWriter(sb ) > > writer = New XmlTextWriter(s w) > > > > 'build xml object > > writer.Formatti ng = Formatting.Inde nted > > writer.WriteSta rtElement("Requ est", Nothing) > > writer.WriteEle mentString("Pag eAccessed", > > Request.ServerV ariables("URL") ) > > writer.WriteEle mentString("Que ryString", > > Request.ServerV ariables("QUERY _STRING")) > > writer.WriteEle mentString("IPA ddress", > > Request.ServerV ariables("REMOT E_ADDR")) > > writer.WriteEle mentString("Ref erer", > > Request.ServerV ariables("HTTP_ REFERER")) > > writer.WriteEle mentString("Use rAgent", > > Request.ServerV ariables("HTTP_ USER_AGENT")) > > writer.WriteEle mentString("Dat e", Date.Now) > > > > writer.WriteEnd Element() > > writer.Flush() > > > > 'make fragment > > Dim doc As XmlDocument = New XmlDocument > > doc.LoadXml(sb. ToString()) > > Dim frag As XmlDocumentFrag ment = doc.CreateDocum entFragment() > > Dim node As XmlNode > > For Each node In doc.ChildNodes > > frag.AppendChil d(node) > > Next > > > > 'add fragment to xml file > > doc.Load(master Doc) > > doc.DocumentEle ment.PrependChi ld(frag) > > > > doc.Save(master Doc) > > > > writer.Close() > > sw.Close() > > Catch ex As Exception > > Response.Write( "can't do it: " + ex.Message) > > Finally > > If Not writer Is Nothing Then > > writer.Close() > > End If > > If Not sw Is Nothing Then > > sw.Close() > > End If > > End Try > > > > > > Thank You > > Reddy > > > This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Magnus |
last post by:
can anyone help me on how to create and manipulate a xmttextwriter without
having to craete a physical file.
I have an application that should return data in xml. But I do not want to
create a file and then delete it.
/Magnus
|
by: Nad |
last post by:
Hello,
I need some help with this:
I am trying to update some data using XmlTextWriter. I instantiate first and
then do some validation and then copy data into the dataset. Finally I commit
the changes. As the following excerpt:
Now the problem is that if there is a validation failure for example,
control ends up in the catch{} block....
|
by: Jonathan Taylor |
last post by:
I have a large XML file, that is too large to read in to XmlDocument.
I need to append data to this XML file without creating a new file, since I
don't want to have two copies of the large file on the server.
I've not seen any example that works so far, even with google. Can anyone
help ?
|
by: Martin |
last post by:
Hi,
I am retriving data from sql server using the xml raw clause and an
xmltextwriter.
this is working out fine except the xml raw clause does not put a root node
on the xml that is returned from sql server and subsequently an xmldocument
can't be created from the xmltextwriter as there is no root element.
however if the xml raw query...
|
by: Atara |
last post by:
I use the following code to load xml file:
Dim srcXml As String = pathDataFiles & "test.xml"
Dim XmlDoc As New Xml.XmlDocument
XmlDoc.Load(srcXml)
If my xml file starts with the line -
<?xml version="1.0" ?>
| |
by: reddy |
last post by:
I am trying to insert a node into an XMLFile. using XMLTextwriter. My
Question is
Is it possible to do without using XMLDocument. Because its loading all the
the file into memory. I just want to insert in the front. My code is give
below.
Is it possible to do without using XMLDOcument?
Dim masterDoc As String =...
|
by: Martin |
last post by:
Hi,
I am retriving data from sql server using the xml raw clause and an
xmltextwriter.
this is working out fine except the xml raw clause does not put a root node
on the xml that is returned from sql server and subsequently an xmldocument
can't be created from the xmltextwriter as there is no root element.
however if the xml raw query...
|
by: deepika patra |
last post by:
hi all,
i want to modify the value of a node of a xml file. i have to do this in c#.net language. i have to assume that the node value of the file wich i want to modify is already created.i shouldn't create a new file as we do using xmltextwriter class.i have to use the already existing file.also i have to read the value of modified node...
|
by: jazzygirl |
last post by:
I'm fairly new to vb.net (self-taught and realizing how much I DON'T know). I need to create an XML output file (I'm quite ignorant in this area as well!). I used an XMLDataDocument and Xml.XmlTextWriter, creating each element node since the agency I'm sending the file to is very specific about the format.
How do I specify an...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it. ...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...
| |