473,852 Members | 1,868 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Dumb question about getElementById and element.classNa me

sp
I create an xml file in a text editor:
<?xml version="1.0" encoding="utf-8"?>
<elts>
<elt id="1" class="c1">cont ent1</elt>
<elt id="2" class="c1">cont ent2</elt>
</elts>

Then I load the file via xmlHttpRequest into xmlData variable.
Why does xmlData.getElem entById('1') return null and
xmlData.firstCh ild.childNodes[0].className returns null also?

(I use Firefox 1.5).

Mar 11 '06 #1
10 2275
sp wrote:
I create an xml file in a text editor:
<?xml version="1.0" encoding="utf-8"?>
<elts>
<elt id="1" class="c1">cont ent1</elt>
<elt id="2" class="c1">cont ent2</elt>
</elts>

Then I load the file via xmlHttpRequest into xmlData variable.
Why does xmlData.getElem entById('1') return null and
xmlData.firstCh ild.childNodes[0].className returns null also?


Post the code.
Mar 12 '06 #2
sp wrote:
I create an xml file in a text editor:
<?xml version="1.0" encoding="utf-8"?>
<elts>
<elt id="1" class="c1">cont ent1</elt>
In HTML, an ID can't start with a number - but that is unlikely to cause
you any actual grief here unless you are trying to turn this into HTML
and browsers have become more strict (most will tolerate IDs that start
with a digit anyway, but it's invalid as HTML).

<elt id="2" class="c1">cont ent2</elt>
</elts>

Then I load the file via xmlHttpRequest into xmlData variable.
Why does xmlData.getElem entById('1') return null and
It could be that the browser is strictly enforcing the above validation,
but I doubt it - post the code.

xmlData.firstCh ild.childNodes[0].className returns null also?
Gecko browsers add text nodes to keep whitespace in the source.
xmlData.firstCh ild.childNodes[0] possibly references a text node that
doesn't have a className attribute.

I think that xmlData.firstCh ild will probably reference the text node
placed after <elts> and that childNodes[0] doesn't exist since a text
node can't have any children. But then I'd expect a result of an error
like 'object expected' or undefined, not null.

(I use Firefox 1.5).


Use the DOM Inspector to see what it makes of your XML. Add some alerts
to see what you've got:

- alert( typeof xmlData );
- alert( typeof xmlData.firstCh ild );
- alert( typeof xmlData.firstCh ild.childNodes );
- alert( typeof xmlData.firstCh ild.childNodes. length );
and so on.
--
Rob
Mar 13 '06 #3
On 12/03/2006 23:48, RobG wrote:
sp wrote:
[snip]
<?xml version="1.0" encoding="utf-8"?>
<elts>
<elt id="1" class="c1">cont ent1</elt>


In HTML, an ID can't start with a number


In general, that is true of any application of SGML, and it is also true
of XML and its applications.

In XML, this is a violation of the ID validity constraint. A conforming,
non-validating parser may continue to process the rest of the document,
but it should be corrected, nevertheless.
The following is based on how I would /expect/ the Gecko engine to
behave. I say this because I've not used its XML DOM, so corrections are
not only welcome, but may be necessary.

[snip]
Why does xmlData.getElem entById('1') return null and
In order for the getElementById method to find an element, it must know
what attributes are identifiers. It doesn't do this by name, but by
type: ID. As you haven't provided a document type, it has no way of
knowing what attributes are of what type. That said, the Gecko engine
doesn't implement a validating parser, therefore it wouldn't actually
fetch the DTD, even if you included a declaration.

There are two options.

1) Define an internal subset for your document.
2) Avoid the getElementById method and walk the document tree.

The former would produce a document that may look something like:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE elts [
<!ELEMENT elts (elt)* >

<!ELEMENT elt (#PCDATA) >
<!ATTLIST elt
id ID #IMPLIED
class NMTOKENS #IMPLIED

]>
<elts>
<elt id="a" class="c1">cont ent1</elt>
<elt id="b" class="c1">cont ent2</elt>
</elts>

[snip]
xmlData.firstCh ild.childNodes[0].className returns null also?


Gecko browsers add text nodes to keep whitespace in the source.


Even if Rob wasn't right about white space nodes, the className property
will be undefined for elements, anyway. The className property, like all
other shortcut attribute properties, is defined for the HTML DOM. As an
XML document should only expose the Core module, you would need to use
methods such as getAttribute to retrieve the attribute value.

[snip]

Mike

--
Michael Winter
Prefix subject with [News] before replying by e-mail.
Mar 13 '06 #4
Michael Winter wrote:
On 12/03/2006 23:48, RobG wrote:
sp wrote:
<?xml version="1.0" encoding="utf-8"?>
<elts>
<elt id="1" class="c1">cont ent1</elt> In HTML, an ID can't start with a number


In general, that is true of any application of SGML, and it is also true
of XML and its applications.


Full ACK.
In XML, this is a violation of the ID validity constraint. A conforming,
non-validating parser may continue to process the rest of the document,
Even a validating XML processor may continue, and then it MUST make a
list of errors available that were encountered while parsing.

The difference between a validating and a non-validating XML processor
is layed out in <URL:http://www.w3.org/TR/REC-xml/>, chapter 5. It is
not specified there that a validating XML processor MUST stop parsing
when it encounters a violation of XML well-formedness.
but it should be corrected, nevertheless.
Indeed.
The following is based on how I would /expect/ the Gecko engine to
behave. I say this because I've not used its XML DOM, so corrections
are not only welcome, but may be necessary.
Gladly.
[snip]
Why does xmlData.getElem entById('1') return null and
In order for the getElementById method to find an element, it must know
what attributes are identifiers. It doesn't do this by name, but by
type: ID. As you haven't provided a document type, it has no way of
knowing what attributes are of what type.
ACK
That said, the Gecko engine doesn't implement a validating parser,
therefore it wouldn't actually fetch the DTD, even if you included
a declaration.
Quite the contrary. Gecko's _XML_ parser is a validating one, and it stops
parsing when it encounters an error (although it is not required to, see
above). The DOCTYPE declaration does matter there for XML document types
in general. But apparently for certain DOCTYPE declarations, such as for
XHTML 1.x, a local catalog file is used, and the DTD resource is not
fetched from the location given by the system identifier of the
declaration, while it is for other XML document types. AFAIS, the internal
subset declaration is evaluated always for XML document types (when served
using the appropriate media type).
There are two options.

1) Define an internal subset for your document.
2) Avoid the getElementById method and walk the document tree.
3) Use an XPath expression, such as //elt[@id="1"]
The former would produce a document that may look something like:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE elts [
<!ELEMENT elts (elt)* >

<!ELEMENT elt (#PCDATA) >
<!ATTLIST elt
id ID #IMPLIED
class NMTOKENS #IMPLIED
[...]
There is no necessity for the restrictions the NMTOKENS type imposes here;
CDATA suffices. This is not (X)HTML, so the value of the `class' attribute
does not need to be a space-separated list of CSS classes.
xmlData.firstCh ild.childNodes[0].className returns null also?

Gecko browsers add text nodes to keep whitespace in the source.


Even if Rob wasn't right about white space nodes, the className property
will be undefined for elements, anyway. The className property, like all
other shortcut attribute properties, is defined for the HTML DOM.


It is defined for document types that W3C DOM Level 2 HTML applies to.
Those are HTML 4.01 document types, and XHTML 1.0 document types.
As an XML document should only expose the Core module, you would need to
use methods such as getAttribute to retrieve the attribute value.


Not only the Core module; consider DOM Level 3 Load and Save, for example.
True is that a user agent should/must not expose interfaces of W3C DOM
Level 2 HTML for XML document types, unless it is an XHTML 1.0 document
type or these interfaces are specified elsewhere.

BTW: While doing research for my response, I have found
<URL:http://www.w3.org/2003/02/06-dom-support.html>.
PointedEars
Mar 13 '06 #5
On 13/03/2006 14:21, Thomas 'PointedEars' Lahn wrote:
Michael Winter wrote:
[snip]
In XML, this is a violation of the ID validity constraint. A
conforming, non-validating parser may continue to process the rest
of the document,


Even a validating XML processor may continue, and then it MUST make a
list of errors available that were encountered while parsing.


But it may only continue to parse in that error reporting capacity. I
was trying to draw the distinction that a non-validating parser may
continue to parse /normally/ (except when encountering a violated
well-formedness constraint).

[snip]
That said, the Gecko engine doesn't implement a validating parser,
therefore it wouldn't actually fetch the DTD, even if you included
a declaration.


Quite the contrary. Gecko's _XML_ parser is a validating one [...]


Then it seems to act in a way that I wouldn't expect: the MDC states
that "Mozilla does not load external entities from the web"[1]. So, it
would seem that it's conditionally validating.

In any case, it is unlikely that the OP will be able to use an external
subset to define his attribute types.
AFAIS, the internal subset declaration is evaluated always for XML
document types (when served using the appropriate media type).
A conforming parser /must/ process the internal subset[2], and the MDC
suggests that it does[1].
There are two options.
[snip]
3) Use an XPath expression, such as //elt[@id="1"]
I should have added, "as it see it." :)

[snip]
class NMTOKENS #IMPLIED


There is no necessity for the restrictions the NMTOKENS type imposes
here; CDATA suffices.


True, but NMTOKEN is a fairly close match for the IDENT lexer token in
the CSS grammar. The CDATA type would be necessary to allow the complete
range of possible values, but I think it would be excessive.

In any case, it was only a suggestion.

[snip]
As an XML document should only expose the Core module, you would
need to use methods such as getAttribute to retrieve the attribute
value.


Not only the Core module; [...]


Indeed. I really didn't mean to make that statement as absolute as it is.

[snip]
BTW: While doing research for my response, I have found
<URL:http://www.w3.org/2003/02/06-dom-support.html>.


I am aware of that document, though it's been a while since I've seen it.

Mike
[1] MDC: DTDs and Other External Entities

<http://developer.mozil la.org/en/docs/XML_in_Mozilla# DTDs_and_Other_ External_Entiti es>
[2] XML 1.0: Non-validating parsers and internal subsets
<http://www.w3.org/TR/REC-xml/#dt-use-mdecl>

--
Michael Winter
Prefix subject with [News] before replying by e-mail.
Mar 13 '06 #6
Michael Winter wrote:
On 13/03/2006 14:21, Thomas 'PointedEars' Lahn wrote:
Michael Winter wrote:
In XML, this is a violation of the ID validity constraint. A
conforming, non-validating parser may continue to process the rest
of the document, Even a validating XML processor may continue, and then it MUST make a
list of errors available that were encountered while parsing.


But it may only continue to parse in that error reporting capacity.


Parse error :)
I was trying to draw the distinction that a non-validating parser may
continue to parse /normally/
A validating XML processor may do the same.
(except when encountering a violated well-formedness constraint).
That is a possibility, not a necessity, which is the very idea of a
non-validating XML processor.
That said, the Gecko engine doesn't implement a validating parser,
therefore it wouldn't actually fetch the DTD, even if you included
a declaration.

Quite the contrary. Gecko's _XML_ parser is a validating one [...]


Then it seems to act in a way that I wouldn't expect: the MDC states
that "Mozilla does not load external entities from the web"[1]. So, it
would seem that it's conditionally validating.


Occam's Razor: MDC, which is a Wiki, is simply wrong about this.
In any case, it is unlikely that the OP will be able to use an external
subset to define his attribute types.
AFAIS, the internal subset declaration is evaluated always for XML
document types (when served using the appropriate media type).
A conforming parser /must/ process the internal subset[2],


| Non-validating processors are REQUIRED to check only the document entity,
^^^^^^^^
| including the entire internal DTD subset, for well-formedness.
^^^^^^^^^^^^^^^ ^^^^^
| [Definition: While they are not required to check the document for
| validity, they are REQUIRED to process all the declarations they read in
| the internal DTD subset and in any parameter entity that they read, up to
^^^^^
| the first reference to a parameter entity that they do not read; that is
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
| to say, they MUST use the information in those declarations to normalize
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^
| attribute values, include the replacement text of internal entities, and
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
| supply default attribute values.]
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^
and the MDC suggests that it does[1].
I do not need MDC to tell me that. It can be easily tested. In fact, I
have said that Gecko's XML parser parses the internal subset, have I not?
class NMTOKENS #IMPLIED

There is no necessity for the restrictions the NMTOKENS type imposes
here; CDATA suffices.


True, but NMTOKEN is a fairly close match for the IDENT lexer token in
the CSS grammar. The CDATA type would be necessary to allow the complete
range of possible values, but I think it would be excessive.


The next sentence in my posting, which you snipped, should clarify this.

Your presumption is that the value of a `class' attribute in a user-defined
XML document type must be a reference to one or more CSS classes. It needs
not to, hence the NMTOKENS restriction is unnecessary here, and misleading.
In any case, it was only a suggestion.


OK
PointedEars
Mar 13 '06 #7
On 13/03/2006 18:45, Thomas 'PointedEars' Lahn wrote:
Michael Winter wrote:
[On validating processors encountering invalid markup]
But it may only continue to parse in that error reporting capacity.
[snip]
I was trying to draw the distinction that a non-validating parser
may continue to parse /normally/


A validating XML processor may do the same.


Sorry. I thought that validating processors were meant to consider
validity errors as fatal. They are not.
(except when encountering a violated well-formedness constraint).


That is a possibility, not a necessity, which is the very idea of a
non-validating XML processor.


Violations of well-formedness constraints are fatal errors, irrespective
of the validating nature of the processor.

well-formedness constraint
[Definition: A rule which applies to all well-formed XML
documents. Violations of well-formedness constraints are
fatal errors.]

fatal error
[Definition: An error which a conforming XML processor must
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^
detect and report to the application. After encountering a
^^^^^^
fatal error, the processor may continue processing the data
to search for further errors and may report such errors to
the application. In order to support correction of errors,
the processor may make unprocessed data from the document
(with intermingled character data and markup) available to
the application. Once a fatal error is detected, however, the
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
processor must not continue normal processing (i.e., it must
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
not continue to pass character data and information about the
document's logical structure to the application in the normal
way).]

[snip]
Then it seems to act in a way that I wouldn't expect: the MDC
states that "Mozilla does not load external entities from the
web"[1]. So, it would seem that it's conditionally validating.


Occam's Razor: MDC, which is a Wiki, is simply wrong about this.


Perhaps, but I don't think it is. In a quick test, I don't see a request
for a DTD made to my test server. With the same document, the W3C
validator (in its XML-like mode) does make such a request.

[snip]
AFAIS, the internal subset declaration is evaluated always for
XML document types (when served using the appropriate media
type).


[snip]
In fact, I have said that Gecko's XML parser parses the internal
subset, have I not?
As shown above, you started your statement with "as far as I see", which
usually denotes some reservations about what's to follow. I merely
stated that I agree, and why.

[snip]
Your presumption is that the value of a `class' attribute in a
user-defined XML document type must be a reference to one or more CSS
classes.


Yes, it is, but I think that it's a fairly safe presumption to make. The
OP can always correct me.

[snip]

Mike

--
Michael Winter
Prefix subject with [News] before replying by e-mail.
Mar 13 '06 #8
Michael Winter wrote:
On 13/03/2006 18:45, Thomas 'PointedEars' Lahn wrote:
Michael Winter wrote: [On validating processors encountering invalid markup]
(except when encountering a violated well-formedness constraint).

That is a possibility, not a necessity, which is the very idea of a
non-validating XML processor.


Violations of well-formedness constraints are fatal errors, [...]


ACK
[...]
the application. Once a fatal error is detected, however, the
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
processor must not continue normal processing (i.e., it must
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
not continue to pass character data and information about the
document's logical structure to the application in the normal
way).]
But what is "normal processing", and what is "the normal way"?
Then it seems to act in a way that I wouldn't expect: the MDC
states that "Mozilla does not load external entities from the
web"[1]. So, it would seem that it's conditionally validating.

Occam's Razor: MDC, which is a Wiki, is simply wrong about this.


Perhaps, but I don't think it is. In a quick test, I don't see
a request for a DTD made to my test server.


My bad. Indeed it does not. That explains why I have to "redeclare"
entities of the used DTD in the internal subset of the DOCTYPE declaration
in order to have Gecko-based UAs display the tree structure of my XML
document if I use references to those entities in it. It would appear
that applying Occam's Razor should have resulted in: I am wrong about
this.
With the same document, the W3C validator (in its XML-like mode)
does make such a request.
ACK
AFAIS, the internal subset declaration is evaluated always for
XML document types (when served using the appropriate media
type).
[snip]
In fact, I have said that Gecko's XML parser parses the internal
subset, have I not?


As shown above, you started your statement with "as far as I see", which
usually denotes some reservations about what's to follow. I merely
stated that I agree, and why.


ACK, sorry.
Your presumption is that the value of a `class' attribute in a
user-defined XML document type must be a reference to one or more CSS
classes.


Yes, it is, but I think that it's a fairly safe presumption to make.


Because? XML is originally but a data format.
The OP can always correct me.


I do not think it is helpful to be more restrictive than first indicated.
So far we are only talking about an XML data source, not something that
is used for rendering. It is better that the OP may wonder about "CDATA",
then gets informed about DTDs, and then finds CDATA not restrictive enough,
than him/her only realizing that the example you posted does not work for
his _arbitrary_ data because it does not validate with your internal
subset.
Regards,
PointedEars
Mar 13 '06 #9
On 13/03/2006 20:45, Thomas 'PointedEars' Lahn wrote:
Michael Winter wrote:
[snip]
the application. Once a fatal error is detected, however,
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^
the processor must not continue normal processing (i.e.,
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^
it must not continue to pass character data and
information about the document's logical structure to the
application in the normal way).]


But what is "normal processing",


Parsing the document in order to construct a document tree, presumably.
and what is "the normal way"?


I should think that is implementation-defined. However, it seems that
they're trying to say that any further data about the document should be
passed in such a way that marks it as erroneous.

[snip]
Your presumption is that the value of a `class' attribute in a
user-defined XML document type must be a reference to one or more
CSS classes.


Yes, it is, but I think that it's a fairly safe presumption to
make.


Because?


The OP is clearly borrowing concepts from HTML, therefore it's not
unreasonable to believe that they will be used in the same way.
The OP can always correct me.


[...] It is better that the OP may wonder about "CDATA", then gets
informed about DTDs, and then finds CDATA not restrictive enough,
than him/her only realizing that the example you posted does not work
for his _arbitrary_ data because it does not validate with your
internal subset.


True. However, I would hope that someone would seek to understand XML[1]
thoroughly before committing to using it to transfer or store
information, in which case the OP would be in a position to evaluate my
earlier suggestion properly.

Mike
[1] The topic in the OP doesn't necessarily mean that the poster
is unfamiliar with the specifics of XML, just the DOM.

--
Michael Winter
Prefix subject with [News] before replying by e-mail.
Mar 14 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
2342
by: Gilles T. | last post by:
How I can get element ID in the edit mode of datagrid control? If I not in the edit mode, there are no problem. <asp:TemplateColumn ItemStyle-CssClass="grid_column_width_3" ItemStyle-HorizontalAlign="center" ItemStyle-VerticalAlign="top"> <ItemTemplate><%# CType(Container.DataItem("DateStatut"),DateTime).ToString("yyyy-MM-dd") %></ItemTemplate> <EditItemTemplate> <asp:TextBox width="80" CssClass="edit_item" id="txtDateStatut"
24
9914
by: Robi | last post by:
I have the following problem: I populate a page with a specific amount of <div id="MyTest"> containers inside another <div> container. for (i=0; i < MyString.length; i++) document.write('<div id="MyTest" style="position:absolute;top:0px;left:0;height:12;width:12;text-align:center">'+MyString+'</div>'); Now if MyString contains 6 characters, I end up with 6 <div id="MyTest"> containers. With IE I am able to access these containers as...
11
1621
by: dhnriverside | last post by:
Hi peeps Ok, so I thought I'd have a go at making a console app in VS2k5... I haven't written any windows apps for years, let alone dos apps (been web programming) and I've hit a dumb error... "An object reference is required for the nonstatic field, method or property " This is occuring in my main function...
7
2268
by: SM | last post by:
Hello, i need to add a classname to an element <ausing JavaScript. I've tried a couple of thing with no success. This is an small piece of my code: .... <li><a href="<?php echo $cd_img; ?>" onClick="show_picture(this); return false;">image 1</a></li> <li><a href="<?php echo $cd_img; ?>" onClick="show_picture(this); return false;">image 2</a></li>
0
9898
marktang
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 usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9748
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 synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
11020
Oralloy
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. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
1
10735
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 most users, this new feature is actually very convenient. If you want to control the update process,...
0
10356
tracyyun
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 choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7907
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
1
4549
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4143
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3180
bsmnconsultancy
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 effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.