xmlbeans-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Keller <pkel...@globalphasing.com>
Subject Re: Validation issues
Date Mon, 21 Jul 2014 15:30:25 GMT
On Mon, 2014-07-21 at 05:50 -0700, jgagnon wrote:
> Sorry for the confusion.  My application does not deal with the Java
> implementation of any of the schema types.  It uses the information from the
> schema to determine test cases to generate and then uses the XMLBeans API
> (mainly XmlCursor) to create an XML instance.  Once the instance is complete
> I then validate it via the XmlObject.validate(XmlOptions options) method and
> save the object to a file.
>
> One of the first things I do is to compile the schema XSD (with
> XmlBeans.compileXsd(...)) to get a SchemaTypeSystem object. This provides me
> with everything else I need.
> 
> The schema defines several abstract types, each of which has some number of
> other schema types that extend them (i.e. <xs:extension
> base="myPrefix:AbstractBaseType">).  As the program works its way through a
> document type to identify and generate test cases, when it encounters an
> element defined by an abstract type, it scans the schema for any types that
> extend that type.  It then generates the element with the type reference
> attribute to point to the specific concrete schema type.

OK - by "generates .. with the type reference..." do you mean that you
are doing something like this?

  xmlCursor.insertAttributeWithValue("type",
      "http://www.w3.org/2001/XMLSchema-instance",
      "myPrefix:ConcreteType");

If so, it seems to me that at this point the XMLBeans API hasn't
associated "myPrefix:" with your namespace, hence the validation
failure. The cursor methods can only work with attribute values of type
java.lang.String, i.e. as far as I can see the XmlCursor API doesn't
provide a bridge between attribute _values_ and anything related to the
schema. What you actually want to insert as the attribute value is an
instance of javax.xml.namespace.QName or org.apache.xmlbeans.XmlQName
rather than a string, but it doesn't seem that there is a way of doing
that.

When the document is read back in by the command-line validator, it
interprets the value of the xsi:type attribute as a QName, so it
validates OK.

> I also generate
> the child content that is defined by the specific concrete type.
> 
> The generation logic inserts the namespace(s) as attributes of the root
> element.  I insert the "default" namespace (i.e.
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance") and the
> schema-specific namespace (e.g. xmlns:myPrefix="my-schema-site") ["myPrefix"
> and "my-schema-site" are not the actual values used, of course].

I work with documents that are very similar to yours without any
problems. There are two differences with what you are doing:

(i) I don't use XmlCursor, but rather the type-specific methods provided
by the XMLBeans-generated API, something like this:

  Instantiate an element of the correct type like this:

    myConcreteType = ConcreteType.Factory.newInstance();

   then populate it and insert it into the XML instance something like
this:

  myContainingElement.setSomeElement(i, myConcreteType);

I don't set the type reference at all, it is just taken care of
automatically by the XMLBeans-generated API.

If this is not practical for you, then perhaps saving and re-parsing the
XML instance before validating would be an acceptable workaround?

(ii) the xmlns:xsi and xmlns:myprefix attributes end up in the element
that is the immediate container of the explicitly typed element rather
than the root element:

 <ContainingElement xmlns:xsi="..." xmlns:myprefix="...">
   <TypedElement xsi:type="myprefix:MyType">
  ...
  </TypedElement>
 </ContainingElement>

or sometimes on the typed element itself. This is a minor annoyance, and
in my hands XmlObject.setSaveAggressiveNamespaces() has no effect when
the document is saved, but it really shouldn't make any difference to
the validation.

> Regarding your comment on the schema version that is used, what can I do
> about that?  

A version 1.0 schema is still valid under the 1.1 standard: I mentioned
it only in order to be clear about which standards document I was using
to look up your error message (the clause numbers are different in the
two standards). As far as I know, if you use XMLBeans, you are using XML
Schema 1.0. Only you can decide whether that is a problem for you (it
isn't for me, FWIW). The introduction to the XML Schema 1.1 document may
be a good starting point:

<http://www.w3.org/TR/xmlschema11-1/#intro1.1>

> I insert the "standard" XML heading into the file before
> validating and saving.  E.g. <?xml version="1.0" encoding="utf-8"?>  Does
> the version number here indicate the schema version number?

No, this is the version of the XML standard that is used, not of XML
Schema. Once again, only you can decide whether you have a need for XML
1.1, or if 1.0 is OK for you. As with XML Schema, there is a preamble to
the newer standard that says something about what issues it is
addressing:

<http://www.w3.org/TR/xml11/#sec-xml11>

Regards,
Peter.

-- 
Peter Keller                                     Tel.: +44 (0)1223 353033
Global Phasing Ltd.,                             Fax.: +44 (0)1223 366889
Sheraton House,
Castle Park,
Cambridge CB3 0AX
United Kingdom



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


Mime
View raw message