473,769 Members | 6,208 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

help with xpath request

Hello :-)

I am learning XPath, and I am trying to get child nodes
of a node whose names do *not* match a given string,
e.g :

<dummy>
<example>
<title>Exampl e 1</title>
<body>this is an example</body>
<picture>a reference to a picture</picture>
</example>
</dummy>

I want to get "body" and "picture" child nodes of the
"example" node. I thought that this request could do
the trick but it is not working :

/dummy/example/*[name()!="title"]

Can someone help me, please ?

Thanks in advance!!!

Nov 9 '06 #1
14 2006

Mat| wrote:
I am learning XPath, and I am trying to get child nodes
of a node whose names do *not* match a given string,
e.g :

<dummy>
<example>
<title>Exampl e 1</title>
<body>this is an example</body>
<picture>a reference to a picture</picture>
</example>
</dummy>

I want to get "body" and "picture" child nodes of the
"example" node. I thought that this request could do
the trick but it is not working :
Precisely how it's not working? What's your XPath
environment? (XSLT processor? If yes, which one of them?
XPath-capable DOM API implementation? If yes, which one of
them? Some sort of XPath-capable XML editor? If yes, which
one of them? If it's XMLSpy, well, I've never used XMLSpy
myself, but every time someone comes to the group saying
'Hey! This doesn't work for me in XMLSpy!', regulars answer
that XMLSpy is broken then. I've seen this happen often
enough that I mentally filed XMLSpy away under the 'Don't
use unless your bloody life depends on it' category.)
/dummy/example/*[name()!="title"]
Given your sample XML, this sure works for me using both
xsltproc and saxon8. A few thoughts:

1. Perhaps you've got an xmlns problem. Try using
local-name():

/dummy/example/*[local-name()!="title"]

(Obviously, this does not apply if you're not using XML
Namespaces.)

2. The above solution is a bit kludgy, consider using
something like:

(/dummy/example/body|/dummy/example/picture)

Or:

(/dummy/example/NS:body|/dummy/example/NS:picture)

Where NS: is the XML Namespace your elements are in. Again,
this won't solve your problem unless there's something
wrong with namespaces.

3. In case the node order in the document matters (and you
have either knowledge or control of precisely how it does
matter) you can use something like:

/dummy/example/*[position() &gt; 1]

Or:

/dummy/example/*[preceding-sibling::title]

A bit inelegant, though.

4. If you're using XSLT, consider matching everything:

/dummy/example/*

....and controlling the result using templates (untested):

<xsl:template match="title"/>
<xsl:template match="body|pic ture">
<xsl:copy-of select="."/>
</xsl:template>

Hope that helps.

--
Pavel Lepin

Nov 9 '06 #2
Hi!

the above XPath /dummy/example/*[name()!="title"] works perfectly in
XMLSpy. As a result it gives the <bodyand <pictureelement s.

I think your suggestions starting from 2. to 4. are a bit strange. They
all require information about the other elements, their order or their
names. The original XPath clearly just needs the "title" name as
information and does what it should.

Regards
spiff
http://www.spycomponents.com

p.*****@ctncorp .com schrieb:
Mat| wrote:
I am learning XPath, and I am trying to get child nodes
of a node whose names do *not* match a given string,
e.g :

<dummy>
<example>
<title>Exampl e 1</title>
<body>this is an example</body>
<picture>a reference to a picture</picture>
</example>
</dummy>

I want to get "body" and "picture" child nodes of the
"example" node. I thought that this request could do
the trick but it is not working :

Precisely how it's not working? What's your XPath
environment? (XSLT processor? If yes, which one of them?
XPath-capable DOM API implementation? If yes, which one of
them? Some sort of XPath-capable XML editor? If yes, which
one of them? If it's XMLSpy, well, I've never used XMLSpy
myself, but every time someone comes to the group saying
'Hey! This doesn't work for me in XMLSpy!', regulars answer
that XMLSpy is broken then. I've seen this happen often
enough that I mentally filed XMLSpy away under the 'Don't
use unless your bloody life depends on it' category.)
/dummy/example/*[name()!="title"]

Given your sample XML, this sure works for me using both
xsltproc and saxon8. A few thoughts:

1. Perhaps you've got an xmlns problem. Try using
local-name():

/dummy/example/*[local-name()!="title"]

(Obviously, this does not apply if you're not using XML
Namespaces.)

2. The above solution is a bit kludgy, consider using
something like:

(/dummy/example/body|/dummy/example/picture)

Or:

(/dummy/example/NS:body|/dummy/example/NS:picture)

Where NS: is the XML Namespace your elements are in. Again,
this won't solve your problem unless there's something
wrong with namespaces.

3. In case the node order in the document matters (and you
have either knowledge or control of precisely how it does
matter) you can use something like:

/dummy/example/*[position() &gt; 1]

Or:

/dummy/example/*[preceding-sibling::title]

A bit inelegant, though.

4. If you're using XSLT, consider matching everything:

/dummy/example/*

...and controlling the result using templates (untested):

<xsl:template match="title"/>
<xsl:template match="body|pic ture">
<xsl:copy-of select="."/>
</xsl:template>

Hope that helps.

--
Pavel Lepin
Nov 9 '06 #3

Please don't top-post.

spiff wrote:
p.*****@ctncorp .com schrieb:
Mat| wrote:
<dummy>
<example>
<title>Exampl e 1</title>
<body>this is an example</body>
<picture>a reference to a picture</picture>
</example>
</dummy>
>
I want to get "body" and "picture" child nodes of the
"example" node. I thought that this request could do
the trick but it is not working :
Precisely how it's not working? What's your XPath
environment?
Some sort of XPath-capable XML editor? If yes, which
one of them? If it's XMLSpy, well, I've never used
XMLSpy myself, but every time someone comes to the
group saying 'Hey! This doesn't work for me in
XMLSpy!', regulars answer that XMLSpy is broken then.
I've seen this happen often enough that I mentally
filed XMLSpy away under the 'Don't use unless your
bloody life depends on it' category.
the above XPath /dummy/example/*[name()!="title"] works
perfectly in XMLSpy. As a result it gives the <bodyand
<pictureelement s.
Good for XMLSpy.
/dummy/example/*[name()!="title"]
Given your sample XML, this sure works for me using
both xsltproc and saxon8. A few thoughts:

1. Perhaps you've got an xmlns problem. Try using
local-name():
2. The above solution is a bit kludgy, consider using
something like:

(/dummy/example/body|/dummy/example/picture)
3. In case the node order in the document matters (and
you have either knowledge or control of precisely how
it does matter) you can use something like:

/dummy/example/*[position() &gt; 1]
4. If you're using XSLT, consider matching everything:

/dummy/example/*

...and controlling the result using templates
(untested):
I think your suggestions starting from 2. to 4. are a
bit strange. They all require information about the
other elements, their order or their names.
2: Yeah, right, you have no information at all about what
you're processing, except that you don't want the title
elements. Sure, it does happen, and when it happens it's
usually a symptom of design problems, either on XML or XML
processing side.

3: It does and I said no less, I believe.

Concerning 4, it's actually just about the best way to
deal with the problem, if you are using XSLT and unless
you need to process only a few of example's children.
The original XPath clearly just needs the "title" name
as information and does what it should.
It does.

And it does break the very moment you introduce XML
Namespaces into the picture. Welcome to the 21st century.
You're a bit late, but that's ok.

KISS principle occasionally leads to PITA problems down
the road.

--
Pavel Lepin

Nov 9 '06 #4
Pavel,
And it does break the very moment you introduce XML
Namespaces into the picture.
What's the point? I don't see any namespaces here in the sample. The
poster says he wants to learn XPath now. Maybe he has no idea about
namespaces at all (yet)? And if you want to consider namespaces take
local-name() or write them explicit.
Welcome to the 21st century.
You're a bit late, but that's ok.
Sorry, but this is just childish.

And your samples are breaking if the structure of the XML is changing
additionally that the original goal was simply to get all elements
which do not match the title element.

regards
spiff
p.*****@ctncorp .com schrieb:
Please don't top-post.

spiff wrote:
p.*****@ctncorp .com schrieb:
Mat| wrote:
<dummy>
<example>
<title>Exampl e 1</title>
<body>this is an example</body>
<picture>a reference to a picture</picture>
</example>
</dummy>

I want to get "body" and "picture" child nodes of the
"example" node. I thought that this request could do
the trick but it is not working :
Precisely how it's not working? What's your XPath
environment?
Some sort of XPath-capable XML editor? If yes, which
one of them? If it's XMLSpy, well, I've never used
XMLSpy myself, but every time someone comes to the
group saying 'Hey! This doesn't work for me in
XMLSpy!', regulars answer that XMLSpy is broken then.
I've seen this happen often enough that I mentally
filed XMLSpy away under the 'Don't use unless your
bloody life depends on it' category.
the above XPath /dummy/example/*[name()!="title"] works
perfectly in XMLSpy. As a result it gives the <bodyand
<pictureelement s.

Good for XMLSpy.
/dummy/example/*[name()!="title"]
>
Given your sample XML, this sure works for me using
both xsltproc and saxon8. A few thoughts:
>
1. Perhaps you've got an xmlns problem. Try using
local-name():
2. The above solution is a bit kludgy, consider using
something like:
>
(/dummy/example/body|/dummy/example/picture)
3. In case the node order in the document matters (and
you have either knowledge or control of precisely how
it does matter) you can use something like:
>
/dummy/example/*[position() &gt; 1]
4. If you're using XSLT, consider matching everything:
>
/dummy/example/*
>
...and controlling the result using templates
(untested):
I think your suggestions starting from 2. to 4. are a
bit strange. They all require information about the
other elements, their order or their names.

2: Yeah, right, you have no information at all about what
you're processing, except that you don't want the title
elements. Sure, it does happen, and when it happens it's
usually a symptom of design problems, either on XML or XML
processing side.

3: It does and I said no less, I believe.

Concerning 4, it's actually just about the best way to
deal with the problem, if you are using XSLT and unless
you need to process only a few of example's children.
The original XPath clearly just needs the "title" name
as information and does what it should.

It does.

And it does break the very moment you introduce XML
Namespaces into the picture. Welcome to the 21st century.
You're a bit late, but that's ok.

KISS principle occasionally leads to PITA problems down
the road.

--
Pavel Lepin
Nov 9 '06 #5
Mat| wrote:
I am learning XPath, and I am trying to get child nodes
of a node whose names do *not* match a given string,
/dummy/example/*[name()!="title"]
As others have said, that should work for the sample document you've
given us. Pavel's suggestions for what to check, and for alternatives
you might want to consider, are good ones.

And while name() certainly does work, I also have to agree with his
warning that this will turn around and bite you when you start working
with namespaced documents. Not a problem right now, but worth pointing
out so folks recognize the mistake when they make it in the future.
<smile/Relying on name() is common as a "quick hack"... but not really
considered a best practice if you intend to write a long-term solution.

--
() ASCII Ribbon Campaign | Joe Kesselman
/\ Stamp out HTML e-mail! | System architexture and kinetic poetry
Nov 9 '06 #6

Much better, but you lost some context; futhermore,
there's no need to quote what you're not replying to.

spiff wrote:
p.*****@ctncorp .com schrieb:
[local-name()-based solution to a problem]
And it does break the very moment you introduce XML
Namespaces into the picture.

What's the point? I don't see any namespaces here in the
sample.
XML Namespaces are fundamental enough that it's best to
learn about them as early as possible. Anyway, your
argument is woefully weak. You don't see any namespaces?
Well, I don't see <titlenot being the first child node,
or any elements other than <title>, <bodyand <picture>
as children of <example>. Therefore, solutions #2 and 3
are exactly as good as #1 - they work on the sample XML
given. Period.
The poster says he wants to learn XPath now. Maybe he
has no idea about namespaces at all (yet)?
And that was precisely the problem I was addressing --
telling the OP about the namespaces.
And if you want to consider namespaces take local-name()
or write them explicit.
In case you missed it, I mentioned that in my post. Of
course, local-name() alone may be not enough, because
<titleand <namespace:titl emay be two totally different
things that need to be processed differently. So you also
need to consider namespace-uri().

And you can't really "write them explicit", because we
need exclusion, not inclusion. Hint: if you define
xmlns:foo="http ://example.org/foo" in your transformation
and xmlns:bar="http ://example.org/foo" in you document,
then match foo:baz node, what its name() is going to be?

[XML Namespaces]
Welcome to the 21st century.
You're a bit late, but that's ok.

Sorry, but this is just childish.
Sure it is.
And your samples are breaking if the structure of the
XML is changing additionally that the original goal was
simply to get all elements which do not match the title
element.
If the structure of the XML is changing, you can't
guarantee *any* solution will work. Sooner or later all of
them will break if you start tinkering with the XML
structure. But some of them may survive the changes that
will break the others. That's exactly the point of showing
the OP various solutions to his problem.

#1 "breaks" if you let the <exampleconta in the
<xhtml:titleele ment. Or <foo:title>. Or if you start
using namespaces for your own elements.

#2 "breaks" if you allow elements other than <title>,
<bodyand <pictureas children of <example>, but isn't
bothered one bit by the document order.

#3 "breaks" if there may be more than one <titlein
<exampleor if title is not required to be the first node
child of <example>, but survives if you allow elements
other than <title>, <bodyand <picture>, if you start
using namespaces or even if you decide that <titlemay
be replaced by <zagolovok>.

#4 "breaks" if... etc.

Simply put: if the XML structure may change, you may need
to change your code no matter what.

If you still don't understand what I'm talking about, or
why I came up with more than one possible solution, please
feel free to flame me to your heart's content, but I'm not
going to be bothered to explain this to you yet again.

Have a nice century,
--
Pavel Lepin

Nov 9 '06 #7
If you still don't understand what I'm talking about, or
why I came up with more than one possible solution, please
feel free to flame me to your heart's content, but I'm not
going to be bothered to explain this to you yet again.

Have a nice century,
Pavel, all of your posts did end with a flame against me. Mine didn't
(against you of course).
Anyway, your
argument is woefully weak. You don't see any namespaces?
Well, I don't see <titlenot being the first child node,
or any elements other than <title>, <bodyand <picture>
as children of <example>. Therefore, solutions #2 and 3
are exactly as good as #1 - they work on the sample XML
given. Period.
Come on. You started to make it important to deal also with something
which is simply not present in the sample. Namespaces, do you remember?

Once again #1 only breaks if you start to deal with namespaces. I don't
know if the poster wants to. Maybe later, maybe never. All of your
suggestions are breaking if you change the structure of the XML.

But I guess you are so upset because I mentioned that XMLSpy can
process this XPath correctly. Nobody was talking about XMLSpy but you
started flaming against it. Any bad experiences here?

Have a nice day Pavel

Nov 9 '06 #8
Joe Kesselman wrote:
Mat| wrote:
>I am learning XPath, and I am trying to get child nodes
of a node whose names do *not* match a given string,

>/dummy/example/*[name()!="title"]


As others have said, that should work for the sample document you've
given us. Pavel's suggestions for what to check, and for alternatives
you might want to consider, are good ones.

And while name() certainly does work, I also have to agree with his
warning that this will turn around and bite you when you start working
with namespaced documents. Not a problem right now, but worth pointing
out so folks recognize the mistake when they make it in the future.
<smile/Relying on name() is common as a "quick hack"... but not really
considered a best practice if you intend to write a long-term solution.
hi,

my 1€...

the best thing to do is :
/dummy/example/*[not(self::title )]

if you would use namespaces, it would become :
/foo:dummy/foo:example/*[not(self::foo:t itle)]

but if you use instead name() :
/foo:dummy/foo:example/*[name()!="foo:ti tle"]
....will give you the same result *only* if the XML source do use the
same prefix, which is somewhat hazardous...

an equivalent expression based on the name of the tag is :
/foo:dummy/foo:example/*[local-name()!="title" or
namespace-uri()!="http://acme.org/foo"]

mmmh, self:: is really better !

--
Cordialement,

///
(. .)
--------ooO--(_)--Ooo--------
| Philippe Poulard |
-----------------------------
http://reflex.gforge.inria.fr/
Have the RefleX !
Nov 9 '06 #9

spiff wrote:
p.*****@ctncorp .com wrote:
spiff wrote:
If you still don't understand what I'm talking about,
or why I came up with more than one possible solution,
please feel free to flame me to your heart's content,
but I'm not going to be bothered to explain this to
you yet again.

Have a nice century,

Pavel, all of your posts did end with a flame against
me. Mine didn't (against you of course).
I suppose I'm not a very patient person, especially where
incompetence or hidden agendas are concerned. Note that
all of my posts contained detailed explanations of my
point of view, while yours arbitrarily ignored my
explanations and contained no sensible arguments at all.
[There are no namespaces in the document --
therefore we don't need to consider namespaces.]
Anyway, your argument is woefully weak. You don't see
any namespaces? Well, I don't see <titlenot being
the first child node, or any elements other than
<title>, <bodyand <pictureas children of
<example>. Therefore, solutions #2 and 3 are exactly
as good as #1 - they work on the sample XML given.
Period.

Come on. You started to make it important to deal also
with something which is simply not present in the
sample. Namespaces, do you remember?
That's called reductio ad absurdum and is meant to
disprove something -- your argument that namespaces are
irrelevant to the discussion in this case. Funny how you
managed to ignore the detailed explanations a few
lines later. I find it hard to believe they're beyond your
level of understanding.

[local-name()-based solution]
Once again #1 only breaks if you start to deal with
namespaces.
Oh, really? How about we change <titleto
<example-title>? Shucks, doesn't work anymore. How about
we add <sub-titleelements -- that don't need to be
processed, of course? How about we allow more than one
<bodyand <pictureand decide to group them into
<documentchildr en of <exampleelement ? Seriously, drop
it already, you're attempting to defend an indefensible
position. Well, I suppose it is defensible if you resort
to blind ignorance, but I would advise against that.
I don't know if the poster wants to. Maybe later, maybe
never. All of your suggestions are breaking if you
change the structure of the XML.
Do you imply you can offer a solution that wouldn't break
no matter what changes we make to the XML document being
processed?! See above. Try reading my previous post again.
Get a clue.
But I guess you are so upset because I mentioned that
XMLSpy can process this XPath correctly.
Oh, seriously? Well, *I* guess you're so upset because I
said in passing that I've seen several mentions of
XMLSpy's brokenness and that scared me away from it. While
we're guessing, I also guess my mention of XMLSpy was why
you wedged into the discussion and started saying my
suggestions were strange, without ever making any points I
haven't already made and blissfully ignoring my attempts
at explaining.

Oh. By the way. Where'd your .sig go? There was this funny
URL in it... hmmm, what was it... Ah, right:
http://www.spycomponents.com
Now, that's great fun!

Since we started guessing, I'd like to guess that you were
trying to indirectly discredit my statement about XMLSpy,
by implying I don't know what I'm talking about on other
matters etc. etc. Obviously, every reader of the group
will decide for himself (and I guess many of them have
already *plonk*ed us both), but really, I guess that was a
somewhat weakish attempt on your part. You gotta try
harder, seriously.

You know, I just *love* guessing.
Nobody was talking about XMLSpy but you started flaming
against it.
Yeah, I suppose I did. Now, what would a sensible person
do? A sensible person would say something like: 'That's
not true, XMLSpy is fully foo-compliant now -- here are
the results of running the foo test suites', or maybe:
'Yeah, it had its share of problems, but the dev team is
working hard, and it's getting better every day'.

Hint: 'XMLSpy runs a trivial XPath expression' is not a
statement of compliance.

A sensible person would probably also mention that he's
ever-so-indirectly affiliated with the product in
question.

Not being a particularly sensible person, I would probably
say something not particularly sensible, like: 'Well, I'd
still stay away from it, but maybe that's just me,' and
you'd be on top of it.
Any bad experiences here?
Any problems with reading skills? From my first post in
this thread:

"I've never used XMLSpy myself [...]"
Have a nice day Pavel
Thanks, I surely had a lot of laughs today.

--
Pavel Lepin

Nov 9 '06 #10

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

Similar topics

0
1929
by: gael.pegliasco | last post by:
Hi, How are you dear and nice helper :) ? I'm trying to test xpath with this simple program : import xml.dom.minidom from xml.xpath.Context import Context import xml.xpath
0
1482
by: Thor W Hammer | last post by:
Is it possible to use dynamic xpath expressions with the <%#XPath("..")%> syntax and XmlDataSource? This is a couple of examples to illustrate what I think about: 1: <%#XPath("*")%> 2: <%#XPath("*%>]")%>
2
1669
by: xerj | last post by:
I've worked out how to retrieve a parameter from a query string in a url using Request.Querystring("whatever"). However, what I can't figure out is how to feed this into an Xpath expression. For instance, say I have an Xpath as follows: food/fruit. How do I programmatically alter the 'typeoffruit' attribute using the querystring in the url (example whatever.aspx?fruit=banana via Request.Querystring or whatever command is needed to...
4
1370
by: Mark Cooney | last post by:
OK this might be long winded by want to show you everything I am doing. Down below is the result I get from an API Call to a website called Betfair. The following is some code I am trying, but I have also tried many different variations. Dim response As HttpWebResponse = request.GetResponse() 'Get the response stream Dim reader As StreamReader = New StreamReader(response.GetResponseStream)
1
2342
by: newToAjax | last post by:
I have created an ajax application which retrievs an xml file and fills in the tab fields on the form.The code works fine in IE while its does not in Mozilla. Can you please let me know if i have to install some plugins to use XPATH? <html> <head> <title>SilverLine </title> <link rel="stylesheet" href="example.css" TYPE="text/css" MEDIA="screen"> <script type="text/javascript"> /* Optional: Temporarily hide the "tabber" class so it...
2
1774
by: Amar | last post by:
I have XML Data: <REQUEST> <PARAMETERS> <PPM Name="CCCS Filed Date" value="xxxx"></PPM> </PARAMETERS> <RECORD _FiledDate="12/15/2003"></RECORD> </REQUEST>
0
1254
by: bruce | last post by:
valid point...!! here's the test python.. ugly as it is!! Lodge It New All About ? Paste #83093
1
2218
by: bruce | last post by:
Hi. Got a test web page, that basically has two "<html" tags in it. Examining the page via Firefox/Dom Inspector, I can create a test xpath query "/html/body/form" which gets the target form for the test. The issue comes when I examine the page's source html. It looks like: <html> <body> </body>
0
9423
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
10211
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...
0
10045
jinu1996
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 captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
9863
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
7406
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...
0
5447
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3958
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
3561
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2815
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.