Re "I need to copy the Root into a Pojo", an XMLBean is a pojo; not sure what 
you're asking.

Re "need to find out which attributes are not in the schemas" I think this does 
what you're asking; crudely effective:

package test;

import java.io.File;

import noNamespace.ATTRTESTDocument;

import org.apache.xmlbeans.QNameSet;
import org.apache.xmlbeans.SchemaProperty;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.XmlObject;
import org.w3c.dom.Node;

public class Atest
{
    private static final QNameSet            QNS         = 
QNameSet.forWildcardNamespaceString("##any", "*");

    public static void main(String[] args)
    throws Exception
    {
        Atest   mod = new Atest();
        mod.go();
    }

    private void go()
    throws Exception
    {
        ATTRTESTDocument    atd     = ATTRTESTDocument.Factory.parse(new 
File("xml/AttrTest.xml"));
        showChildAttributes(atd);
    }

    private static void showChildAttributes(XmlObject xo)
    throws Exception
    {
        String      parentName  = xo.getDomNode().getLocalName();
        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
            (
                parentName+":"+
                childName+"="+
                childValue+"\n\t"+
                "defined in XSD:"+isInXsd
           );
        }

        XmlObject[] xoChildren  = xo.selectChildren(QNS);
        if (xoChildren != null)
        {
            for (int i=0; i < xoChildren.length; i++)
            {
                showChildAttributes(xoChildren[i]);
            }
        }
    }

    private static boolean isAttributeInSchema(XmlObject xo, String name)
    {
        boolean                 ret         = false;
        SchemaType              xoSt        = xo.schemaType();
        SchemaProperty[]        xoSps       = xoSt.getAttributeProperties();

        if (xoSps.length > 0)
        {
            for (int i=0; i < xoSps.length; i++)
            {
                SchemaProperty    xoSp   = xoSps[i];
                if (xoSp.getName().toString().equals(name))
                {
                    ret = true;
                    break;
                }
            }
        }
        return ret;
    }
}

In my test this returned:
ATTRTEST:noNamespaceSchemaLocation=../xsd/AttrTest.xsd
      defined in XSD:false
TESTELEM:DEFATTR=defined
      defined in XSD:true
TESTELEM:BOGUSATTR=bogus
      defined in XSD:false
BOGUSELEM:BOGOSITY=true
      defined in XSD:false
________________________________
Paul Gillen












________________________________
From: Sebastien Dionne [mailto:survivan...@gmail.com]
Sent: Wednesday, December 23, 2009 7:07 PM
To: user@xmlbeans.apache.org
Subject: Re: Xmlbeans is able to retrieve extra attribute from xml ?

I found the problem.. a cut and paste error

root = RootDocument.Factory.parse(new File("./src/test/resources/device.xml"));

I forgot the new File() :(

now when I do root.toString();

I see the original file imported.. that,s perfect.

now I need to copy the Root into a Pojo.

there is a easy way to do that ?   and I need to find out which attributes are 
not in the schemas.. like that I'll convert them in a structure like JAXB  Map 
otherAttributes


2009/12/23 Sebastien Dionne 
<survivan...@gmail.com<mailto:survivan...@gmail.com>>
works fine with JAXB.  and the syntax is fine.


XSD

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
   <device>
      <deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
      <serviceList>
         <service>
            
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
            
<serviceId>urn:upnp-org:serviceId:urn:schemas-upnp-org:service:ConnectionManager</serviceId>
            <SCPDURL>ConnectionManager.xml</SCPDURL>
            <controlURL>ConnectionManager/Control</controlURL>
            <eventSubURL>ConnectionManager/Event</eventSubURL>
         </service>
      </serviceList>
   </device>
</root>


XML received

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
   <device>
      <deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
      <serviceList>
         <service>
            
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
            
<serviceId>urn:upnp-org:serviceId:urn:schemas-upnp-org:service:ConnectionManager</serviceId>
            <SCPDURL>ConnectionManager.xml</SCPDURL>
            <controlURL>ConnectionManager/Control</controlURL>
            <eventSubURL>ConnectionManager/Event</eventSubURL>
         </service>
      </serviceList>
      <dlna:X_DLNADOC xmlns:ns2="urn:schemas-upnp-org:device-1-0" 
xmlns="">DMS-1.00</dlna:X_DLNADOC>
   </device>
</root>
2009/12/23 Cezar Andrei 
<cezar.and...@oracle.com<mailto:cezar.and...@oracle.com>>
It's probably because the document is not a well formed XML document.

Cezar

________________________________
From: Sebastien Dionne 
[mailto:survivan...@gmail.com<mailto:survivan...@gmail.com>]
Sent: Wednesday, December 23, 2009 11:17 AM

To: user@xmlbeans.apache.org<mailto:user@xmlbeans.apache.org>
Subject: Re: Xmlbeans is able to retrieve extra attribute from xml ?

thanks, but why do I obtain a exception CDATA when I parse a xml that contains 
more data then the schema ?

RootDocument root = RootDocument.Factory.parse(new File("./src/test/resources/
RootDevice.xml"));
System.out.println(root.toString());

Exception in thread "main" org.apache.xmlbeans.XmlException: error: Unexpected 
element: CDATA
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3486)
    at org.apache.xmlbeans.impl.store.Locale.parse(Locale.java:712)

2009/12/23 Cezar Andrei 
<cezar.and...@oracle.com<mailto:cezar.and...@oracle.com>>
Sebastien,

It is possible, please check the XmlCursor interface. On the xmlbeans object 
you have the attributes, call:
XmlCursor xc = xobj.getCursor(); . Move the cursor around with 
xc.toFirstAttribute(); xc.toNextAttribute();
And get info on the current token, in your case the attribute: xc.getName 
xc.getTextValue, and when you're done call xc.dispose().

Cezar

________________________________
From: Sebastien Dionne 
[mailto:survivan...@gmail.com<mailto:survivan...@gmail.com>]
Sent: Wednesday, December 23, 2009 7:10 AM
To: user@xmlbeans.apache.org<mailto:user@xmlbeans.apache.org>
Subject: Xmlbeans is able to retrieve extra attribute from xml ?

I have a simple question.


I have a xsd standard (string..no complextype).

I receive xml message that can contains extra attributes that are not in the 
xsd.

With JAXB they are put into

    /**
     * Gets a map that contains attributes that aren't bound to any typed 
property on this class.
     *
     * <p>
     * the map is keyed by the name of the attribute and
     * the value is the string value of the attribute.
     *
     * the map returned by this method is live, and you can add new attribute
     * by updating the map directly. Because of this design, there's no setter.
     *
     *
     * @return
     *     always non-null
     */
    public Map<QName, String> getOtherAttributes() {
        return otherAttributes;
    }

but is it possible to do something similar with xmlbeans ?

It a showstopper if I can't do that.

thanks


--
-------------
A+

Sébastien.

Vous pouvez me suivre sur Twitter / You can follow me on Twitter : 
http://twitter.com/survivant



--
-------------
A+

Sébastien.

Vous pouvez me suivre sur Twitter / You can follow me on Twitter : 
http://twitter.com/survivant



--
-------------
A+

Sébastien.

Vous pouvez me suivre sur Twitter / You can follow me on Twitter : 
http://twitter.com/survivant



--
-------------
A+

Sébastien.

Vous pouvez me suivre sur Twitter / You can follow me on Twitter : 
http://twitter.com/survivant

Reply via email to