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