Schema - Definition for checking part of schema ?

Abhinav (archive)

Usenet Archive
Joined
Mar 29, 2004
Messages
88
Reaction score
0
Hi,

I have an xml which contains the following

<a>
<!-- aa Is what I am interested in -->
<aa>
</aa>

<bb></bb>
<cc></cc>

</a>

Here, my application requires that <a> (The root element) *must* contain <aa> tag.

However, tags such as <bb>, <cc>, or anything else might exist - they are optional, and I do not know which of them (if at all) will be present.

How do I write the schema for it ?

Using all requires that I know which tags might appear ..

Using any doesnt allow me to check the presence of the specific tag <aa>

Any pointers on how to achieve this ?

TIA
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
Abhinav wrote:

I have an xml which contains the following

<a>
<!-- aa Is what I am interested in -->
<aa>
</aa>

<bb></bb>
<cc></cc>

</a>

Here, my application requires that <a> (The root element) *must* contain <aa> tag.

However, tags such as <bb>, <cc>, or anything else might exist - they are optional, and I do not know which of them (if at all) will be present.

How do I write the schema for it ?

Using all requires that I know which tags might appear ..

Using any doesnt allow me to check the presence of the specific tag <aa>

Any pointers on how to achieve this ?

It is simple, use a sequence with one defined element and xs:any:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">

<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="aa" type="xs:string" />
<xs:any processContents="lax" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>
 

Abhinav (archive)

Usenet Archive
Joined
Mar 29, 2004
Messages
88
Reaction score
0
Martin said:
Abhinav wrote:

It is simple, use a sequence with one defined element and xs:any:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">

<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="aa" type="xs:string" />
<xs:any processContents="lax" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

Thanks .. That worked ..

However, If I want to ignore elements both *before* and *after* <aa> ? adding another <xs:any> before <xs:element name="aa"> does not work.
XML::Xerces gives the error :

MESSAGE: Not enough elements to match content model : '((,aa),)'

Any pointers appreciated!

TIA
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
Abhinav said:
However, If I want to ignore elements both *before* and *after* <aa> ? adding another <xs:any> before <xs:element name="aa"> does not work.
XML::Xerces gives the error :

Is the number of elements before <aa> known? Otherwise I think you get a problem with the schema being non-deterministic.
 

Abhinav (archive)

Usenet Archive
Joined
Mar 29, 2004
Messages
88
Reaction score
0
Martin said:
Abhinav wrote:

Is the number of elements before <aa> known? Otherwise I think you get a problem with the schema being non-deterministic.
Hmm ..

It is not known .. but it is definitely more than 1.

Putting maxOccurs="10" (An arbotrary value I can live with) did not solve the problem ..

Do you mean to say that it is not possible to do it at all ? (I read the Schema specs on w3c.org, but could not find to many pointers.

TIA
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
Abhinav wrote:

It is not known .. but it is definitely more than 1.

Putting maxOccurs="10" (An arbotrary value I can live with) did not solve the problem ..

Do you mean to say that it is not possible to do it at all ?

From my current understanding and tests with Xerces-J and MSXML you need to specify a fixed number of occurances otherwise the parser is unable to determine where the element you want to check for is. But maybe someone else comes up with a workaround.
 

Abhinav (archive)

Usenet Archive
Joined
Mar 29, 2004
Messages
88
Reaction score
0
Martin said:
Abhinav wrote:

From my current understanding and tests with Xerces-J and MSXML you need to specify a fixed number of occurances

Even the fixed number of occurences does not work in Xerces-P ! The only thing that works in minOccurs=maxOccurs=1.

otherwise the parser is
unable to determine where the element you want to check for is. But maybe someone else comes up with a workaround.

Regards
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
548,208
Messages
3,104,802
Members
249,594
Latest member
henrywalsh

Latest Threads

Top