RE: Xmlbeans is able to retrieve extra attribute from xml ?

"Gillen, Paul" <[email protected]>
Newsgroups gmane.text.xml.xmlbeans.user
Message-ID <6A51CF4158562249906CB0F24DC99E444CD85DFD71@GATUCEXCH03ASV.nscorp.ad.nscorp.com>
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:[email protected]]
Sent: Wednesday, December 23, 2009 7:07 PM
To: [email protected]
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 <[email protected]<mailto:[email protected]>>
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 <[email protected]<mailto:[email protected]>>
It's probably because the document is not a well formed XML document.

Cezar

________________________________
From: Sebastien Dionne [mailto:[email protected]<mailto:[email protected]>]
Sent: Wednesday, December 23, 2009 11:17 AM

To: [email protected]<mailto:[email protected]>
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 <[email protected]<mailto:[email protected]>>
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:[email protected]<mailto:[email protected]>]
Sent: Wednesday, December 23, 2009 7:10 AM
To: [email protected]<mailto:[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.