If you only take away one thing from this blog posting, let it be this:
XML Protip:
If you can’t figure out why your XPath expression isn’t working, check the namespace.XML Namespaces
It is possible to define XML elements and attributes in different namespaces.This promotes reuse of existing vocabularies because, rather than copying someone else's elements and attributes into your schema, you can just directly incorporate their XML vocabulary into your instance documents.
Namespaces Look Like URLs
XML Namespaces look like URLs, although there is no requirement that there be anything in particular that you can retrieve at the end of the URL. But URLs are convenient because they are a well-established way to have a federated naming scheme. In other words, if I own an Internet domain, I can make up URLs within that domain without needing to consult any centralized authority. That means I can use URLs to mint new, guaranteed unique namespace identifiers.Declaring Namespaces
You can use xmlns to declare a default namespace
<newsItem xmlns='http://iptc.org/std/nar/2006-10-01/'>
<itemMeta>
<title>Pope Blesses Astronauts</title>
<title>Pope Blesses Astronauts</title>
</itemMeta>
</newsItem>
</newsItem>
In the above example, newsItem is in the http://iptc.org/std/nar/2006-10-01 namespace.
itemMeta and title are also in the http://iptc.org/std/nar/2006-10-01/ namespace, even though they don't have any xmlns listed on the elements. That's because child elements inherit the namespace from their parents.
XML Namespace Prefixes
You can use xmlns:prefix to declare a namespace and bind it to a prefix<nar:newsItem xmlns:nar='http://iptc.org/std/nar/2006-10-01/'>
<nar:itemMeta>
<nar:title>Pope Blesses Astronauts</nar:title>
</nar:itemMeta>
</nar:newsItem>
Whether you use a prefix on each namespaced element or you leave them unadorned is a matter of style and personal preference.
Namespace are Useful, but can be Confusing
Although namespaces are important in constructing modular XML documents and avoiding re-inventing the wheel of vocabularies, they can be quite confusing. In particular, the non-prefix syntax (in which an element inherits its namespace from its parent) can catch you out in various ways.For example, if you were to just copy and paste the "inner" markup from the first document above, you'd wind up with the document below - and lose the namespace!
<itemMeta>
<title>Pope Blesses Astronauts</title>
<title>Pope Blesses Astronauts</title>
</itemMeta>
This is bad.
Similarly, it is routine to look at an instance document and construct an XPath such as this to pick out the value of the title element:
itemMeta/title
And spend hours trying to figure out why it isn't working. Of course, you know that it is because we didn't specify that the itemMeta and title elements need to be in the http://iptc.org/std/nar/2006-10-01/ namespace.
Hence my number one tip for debugging XML-related code:
No comments:
Post a Comment