Schema - Definition for checking part of schema ?

A

Abhinav

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
 
M

Martin Honnen

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>
 
A

Abhinav

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
 
M

Martin Honnen

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.
 
A

Abhinav

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
 
M

Martin Honnen

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.
 
A

Abhinav

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
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top