You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xerces.apache.org by "H.-Gerd Rosarius" <ge...@brainsandbytes.de> on 2002/08/27 15:55:54 UTC

How to implement getElementById() with Xerces using XML Schema?

According to the Xerces Java API it should be possible to search
an entire DOM-Document for an Element with a specific ID using
getElementById( String elementId ).

The documentation states that I have to tell the
DOM-Implementation what the name of the id-Attribute is.
Either by use of a DTD or a XML Schema.

If I use a DTD to specify my id-attribute and assign it to my
XML file, getElementById() returns an object of type Element.
If I use a XML Schema I get 'null' instead.
I tried Xerces 2.0.1 and 2.0.2 .

The FAQ-Page of the Apache-Group says about Xerces:
"According to the XML Schema specification, an instance document
might have more than one validation root and ID/IDREFS must be unique
only within the context of a particular validation root, meaning
that a document may potentially contain multiple identical ids.
In this case, the output of getElementById() is unspecified. On
the other hand, if the document root is a validation root of the
document, getElementById() should work as expected."
http://xml.apache.org/xerces2-j/faq-general.html#faq-5

Haeh???

Question: How do I have to change my XML-Schema or Java-code
to be able to use getElementById() in combination with a
XML-Schema?

Here is the XML- and Schema-code which I tried. Any help is welcome.

he XML-File:
-------------
<?xml version="1.0" encoding="UTF-8"?>
<katalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="katalog.xsd">
  <book id="abc123">
    <author>Steven King</author>
  </book>
  <book id="abc124">
    <author>Tom Clancy</author>
  </book>
</katalog>


The XML Schema:
---------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
  <xs:element name="katalog">
    <xs:complexType>
	<xs:sequence>
	  <xs:element name="book" maxOccurs="unbounded">
	    <xs:complexType>
		<xs:sequence>
		  <xs:element name="author" type="xs:string"/>
		</xs:sequence>
		<xs:attribute name="id" type="xs:ID" use="required"/>
	    </xs:complexType>
	  </xs:element>
	</xs:sequence>
    </xs:complexType>
    <xs:key name="schluessel">
	<xs:selector xpath=".//book"/>
	<xs:field xpath="@id"/>
    </xs:key>
  </xs:element>
</xs:schema>


  H.-Gerd


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org


Re: How to implement getElementById() with Xerces using XML Schema?

Posted by "H.-Gerd Rosarius" <ge...@brainsandbytes.de>.
Elena,

you are great! I changed my code as you said and now it works.

Thanks a lot!!!

  H.-Gerd Rosarius


-----Ursprüngliche Nachricht-----
Von: Elena Litani [mailto:elitani@ca.ibm.com]
Gesendet: Mittwoch, 28. August 2002 22:05
An: xerces-j-user@xml.apache.org
Betreff: Re: How to implement getElementById() with Xerces using XML
Schema?


"H.-Gerd Rosarius" wrote:
> If I use a DTD to specify my id-attribute and assign it to my
> XML file, getElementById() returns an object of type Element.
> If I use a XML Schema I get 'null' instead.
> I tried Xerces 2.0.1 and 2.0.2 .

You need to turn on both validation and schema validation features on,
otherwise the getElementById() would not work correctly. I've tried it
with the latest CVS version and it works.

> The FAQ-Page of the Apache-Group says about Xerces:
> "According to the XML Schema specification, an instance document
> might have more than one validation root and ID/IDREFS must be unique
> only within the context of a particular validation root, meaning
> that a document may potentially contain multiple identical ids.
> In this case, the output of getElementById() is unspecified. On
> the other hand, if the document root is a validation root of the
> document, getElementById() should work as expected."
> http://xml.apache.org/xerces2-j/faq-general.html#faq-5
> Haeh???

XML Schema defines that each document could have multiple validation
roots -- the element at which validation starts.
During loading there is no way (currently) so specify validation roots
in Xerces, thus Xerces always treats the document root as validation
root.
However, in the future it is possible to give XPath expression
specifying at what elements validation should start. For example:

<documentRoot>
<validationRoot_1>Some Data</validationRoot_1>
<validationRoot_2>Some Data</validationRoot_2>
<documentRoot>

In this case, ID/IDREF must be unique in the scope of validationRoot_1
or in scope of validationRoot_2, however ID/IDREF table might not be
unique for documentRoot.

Hope it helps,
--
Elena Litani / IBM Toronto


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org


Re: How to implement getElementById() with Xerces using XML Schema?

Posted by Elena Litani <el...@ca.ibm.com>.
"H.-Gerd Rosarius" wrote:
> If I use a DTD to specify my id-attribute and assign it to my
> XML file, getElementById() returns an object of type Element.
> If I use a XML Schema I get 'null' instead.
> I tried Xerces 2.0.1 and 2.0.2 .

You need to turn on both validation and schema validation features on,
otherwise the getElementById() would not work correctly. I've tried it
with the latest CVS version and it works.

> The FAQ-Page of the Apache-Group says about Xerces:
> "According to the XML Schema specification, an instance document
> might have more than one validation root and ID/IDREFS must be unique
> only within the context of a particular validation root, meaning
> that a document may potentially contain multiple identical ids.
> In this case, the output of getElementById() is unspecified. On
> the other hand, if the document root is a validation root of the
> document, getElementById() should work as expected."
> http://xml.apache.org/xerces2-j/faq-general.html#faq-5
> Haeh???

XML Schema defines that each document could have multiple validation
roots -- the element at which validation starts.
During loading there is no way (currently) so specify validation roots
in Xerces, thus Xerces always treats the document root as validation
root. 
However, in the future it is possible to give XPath expression
specifying at what elements validation should start. For example:

<documentRoot> 
<validationRoot_1>Some Data</validationRoot_1>
<validationRoot_2>Some Data</validationRoot_2>
<documentRoot>

In this case, ID/IDREF must be unique in the scope of validationRoot_1
or in scope of validationRoot_2, however ID/IDREF table might not be
unique for documentRoot.

Hope it helps,
-- 
Elena Litani / IBM Toronto

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org