You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@xmlbeans.apache.org by "Anthony B. Coates (Google)" <ab...@googlemail.com> on 2010/02/01 23:10:08 UTC
Re: How to recognise reference to global element when walking Schema
structure using Schema Object Model API?
Thanks, I tried this, but I don't think it's quite right. I think it is
making some assumptions about the element types, so while it works for the
example, I don't think it will work generally.
For my purposes, I only needed to determine whether a local element has
element substitutions. While this means it is a global element reference,
I don't need to know that directly.
After some playing around, this is what I found seems to work:
* you need the parent SchemaType for your SchemaLocalElement
* use SchemaType#getElementProperty, with the name of your
SchemaLocalElement as the argument
* with the returned SchemaProperty, get the 'acceptedNames', and then test
which global elements have these QNames
* the matching global elements are the valid substitutions.
Cheers, Tony.
PS you can see code that implements this, albeit in Scala, in the source
code for XML Zebra (http://www.xmlzebra.com/).
On Mon, 28 Dec 2009 19:33:11 -0000, Gillen, Paul <pa...@nscorp.com>
wrote:
> Never occurred to me to try. I wonder what your use case is? That
> having been said, this was kind of fun to dink around with. One of the
> things to note is that an element can have a name the same as a global
> element so simply comparing the names won't work. I think the following
> (a) does what you're asking and (b) works; let me know.
>
>
>
> My XSD (Note that "UnusedGlobal" is used both as a name for an
> "ExternalType" and for a global element):
>
> <?xml version="1.0" encoding="UTF-8"?>
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
> elementFormDefault="qualified" attributeFormDefault="unqualified">
>
> <xs:element name="ATTRTEST">
>
> <xs:complexType>
>
> <xs:sequence>
>
> <xs:element name="TESTELEM">
>
> <xs:complexType>
>
> <xs:attribute name="DEFATTR"
> type="xs:string"/>
>
> </xs:complexType>
>
> </xs:element>
>
> <xs:element ref="Element"/>
>
> <xs:element name="UnusedGlobal"
> type="ExternalType"/>
>
> </xs:sequence>
>
> </xs:complexType>
>
> </xs:element>
>
> <xs:complexType name="ExternalType">
>
> <xs:attribute name="externalTypeAttribute"
> type="xs:string" use="required"/>
>
> </xs:complexType>
>
> <xs:element name="Element">
>
> <xs:complexType>
>
> <xs:attribute name="elementAttribute"
> type="xs:string" use="required"/>
>
> </xs:complexType>
>
> </xs:element>
>
> <xs:element name="UnusedGlobal">
>
> <xs:complexType>
>
> <xs:attribute name="elementAttribute"
> type="xs:string" use="required"/>
>
> </xs:complexType>
>
> </xs:element>
>
> </xs:schema>
>
>
>
> Test XML:
>
> <?xml version="1.0" encoding="UTF-8"?>
>
> <ATTRTEST xsi:noNamespaceSchemaLocation="../xsd/AttrTest.xsd"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
>
> <TESTELEM DEFATTR="defined attribute"/>
>
> <Element elementAttribute="element attribute from global
> element"/>
>
> <UnusedGlobal externalTypeAttribute="attribute from complex
> type"/>
>
> </ATTRTEST>
>
>
>
> Program (extended from earlier question; forgive extraneous bits):
>
> package test;
>
>
>
> import java.io.File;
>
>
>
> import noNamespace.ATTRTESTDocument;
>
>
>
> import org.apache.xmlbeans.QNameSet;
>
> import org.apache.xmlbeans.SchemaGlobalElement;
>
> import org.apache.xmlbeans.SchemaProperty;
>
> import org.apache.xmlbeans.SchemaType;
>
> import org.apache.xmlbeans.SchemaTypeSystem;
>
> import org.apache.xmlbeans.XmlObject;
>
> import org.w3c.dom.Node;
>
>
>
> public class Atest
>
> {
>
> private static final QNameSet QNS =
> QNameSet.forWildcardNamespaceString("##any", "*");
>
> private ATTRTESTDocument atd;
>
>
>
> public static void main(String[] args)
>
> throws Exception
>
> {
>
> Atest mod = new Atest();
>
> mod.go();
>
> }
>
>
>
> private void go()
>
> throws Exception
>
> {
>
> atd = ATTRTESTDocument.Factory.parse(new
> File("xml/AttrTest.xml"));
>
>
>
> SchemaTypeSystem docSts =
> atd.schemaType().getTypeSystem();
>
> SchemaGlobalElement[] docSges = docSts.globalElements();
>
>
>
> System.out.println("These are the global elements -
> "+docSges.length);
>
> for (SchemaGlobalElement docSge:docSges)
>
> {
>
> System.out.println("\t"+docSge.getName());
>
> }
>
> System.out.println("");
>
>
>
> showChildAttributes(atd);
>
> }
>
>
>
> private void showChildAttributes(XmlObject xo)
>
> throws Exception
>
> {
>
> boolean parentIsGlobal = isGlobalElement(atd, xo);
>
> String parentName = xo.getDomNode().getLocalName();
>
> System.out.println
>
> (
>
> parentName +
>
> "(globalElement="+parentIsGlobal+"):"
>
> );
>
>
>
> XmlObject[] xoAttrs = xo.selectAttributes(QNS);
>
>
>
> for (int i = 0; i < xoAttrs.length; i++)
>
> {
>
> Node domainNode = xoAttrs[i].getDomNode();
>
> String childName = domainNode.getLocalName();
>
> String childValue = domainNode.getNodeValue();
>
> boolean isInXsd = isAttributeInSchema(xo, childName);
>
> System.out.println
>
> (
>
> "\t" +
>
> childName + "=\"" +
>
> childValue + "\"\n\t" +
>
> "attribute defined in XSD:" + isInXsd
>
> );
>
>
>
> }
>
>
>
> XmlObject[] xoChildren = xo.selectChildren(QNS);
>
> if (xoChildren != null)
>
> {
>
> for (XmlObject xoChild:xoChildren)
>
> {
>
> showChildAttributes(xoChild);
>
> }
>
> }
>
> }
>
>
>
> private boolean isAttributeInSchema(XmlObject xo, String name)
>
> throws Exception
>
> {
>
> boolean ret = false;
>
> SchemaType xoSt = xo.schemaType();
>
> SchemaProperty[] xoSps = xoSt.getAttributeProperties();
>
> for (SchemaProperty xoSp:xoSps)
>
> {
>
> if (xoSp.getName().toString().equals(name))
>
> {
>
> ret = true;
>
> break;
>
> }
>
> }
>
> return ret;
>
> }
>
>
>
> private boolean isGlobalElement(XmlObject doc, XmlObject xo)
>
> {
>
> boolean ret = false;
>
> SchemaTypeSystem docSts =
> doc.schemaType().getTypeSystem();
>
> SchemaGlobalElement[] docSges = docSts.globalElements();
>
>
>
> for (SchemaGlobalElement docSge:docSges)
>
> {
>
> ret =
> docSge.getType().getComponentRef().getComponent().equals(xo.schemaType().getRef().getComponent());
>
> if (ret)
>
> {
>
> break;
>
> }
>
> }
>
> return ret;
>
> }
>
> }
>
>
>
> Results (Note the results for "UnusedGlobal" which is a name for type
> "ExternalType", not a reference to the global element of the same name):
>
> These are the global elements - 3
>
> UnusedGlobal
>
> ATTRTEST
>
> Element
>
>
>
> null(globalElement=false):
>
> ATTRTEST(globalElement=true):
>
> noNamespaceSchemaLocation="../xsd/AttrTest.xsd"
>
> attribute defined in XSD:false
>
> TESTELEM(globalElement=false):
>
> DEFATTR="defined attribute"
>
> attribute defined in XSD:true
>
> Element(globalElement=true):
>
> elementAttribute="element attribute from global element"
>
> attribute defined in XSD:true
>
> UnusedGlobal(globalElement=false):
>
> externalTypeAttribute="attribute from complex type"
>
> attribute defined in XSD:true
>
>
>
> Paul Gillen
>
>
>
>
>
> -----Original Message-----
> From: Anthony B. Coates (Google) [mailto:abcoates@googlemail.com]
> Sent: Saturday, December 26, 2009 7:25 AM
> To: XMLBeans Users List
> Subject: How to recognise reference to global element when walking
> Schema structure using Schema Object Model API?
>
>
>
> Hi. I'm walking a Schema structure using the Schema Object Model API.
>
> It's pretty good, I must say, but one thing I can't work out is how, when
>
> examining the children of a complex type, you can tell which are local
>
> elements, and which are references to global elements. Can anyone tell
> me
>
> what the trick is? Thanks very much in advance,
>
>
>
> Cheers, Tony.
>
>
>
>
>
> ---------------------------------------------------------------------
>
> To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
>
> For additional commands, e-mail: user-help@xmlbeans.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org