Hello,    

 

Sorry, but I am new to XmlBeans, so please bear with me.

 

We would like to take a fragment of xml, pass it to the appropriate
generated XmlBean factory's parse() method, get back a new generated
XmlBean object, and then use its API to get values of attributes,
children generated XmlBean objects. Etc. 

 

I pass the xml fragment to the generated XmlBeans object factory class's
parse() method and get back my generated XmlBean object.

I then call "getName()" on it to get the "name" attribute value from it,
but the value is null. 

 

I added a "validate()" call on the generated xml bean class after the
"parse()" call, and it says that the xml is invalid. I think this is why
its not working - it cannot parse the xml, so thus it cannot populate
the generated xml bean object.

 

Can a non document level generated XmlBean factory parse the
corresponding xml fragment and properly populate the generated XmlBean
object? It seems like it (also seems like a very useful feature). 

 

I have been reading the XmlBeans documentation, and googling all day,
but I cannot get a clear answer about this (at for me).

 

Below is the relevant code snippets that exhibit this behavior.

 

My xsd is something like this:

 

<xsd:schema 

    xmlns:xsd="http://www.w3.org/2001/XMLSchema";

    xmlns:cfgr="http://prosrm.com/configurator/xmlbeans";

    targetNamespace="http://prosrm.com/configurator/xmlbeans";

    elementFormDefault="qualified">

 

    <xsd:element name="Application">

      <xsd:complexType mixed="false">        

            <xsd:sequence>

                <xsd:element name="Table" type="cfgr:Table"
minOccurs="1" maxOccurs="unbounded"/>

            </xsd:sequence>

      </xsd:complexType> 

 

    <xsd:complexType name="Table" mixed="false">

    

        <!-- "Table" is a list of "Column"s and "Constraint"s -->

        <xsd:sequence>    

            <xsd:element name="Column" type="cfgr:Column" minOccurs="1"
maxOccurs="unbounded"/>

        </xsd:sequence>    

        

        <xsd:attribute name="name" form="unqualified" type="xsd:string"
use="required"/>

    </xsd:complexType>

 ...

 

Using the generated XmlBeans Table class from the above xsd , the code
below tries to parse a "Table" xml fragment into a generated XmlBeans
"Table" object. It then tries to access the "name" attribute on this
object (this returns null). It then does the validate (which fails):

 

            // parse Table xml fragment into a Table object. The
"toString()" works!!

            String tableStr = "<xml-fragment
xmlns:cfgr=\"http://prosrm.com/configurator/xmlbeans\"; >" +

                              "  <cfgr:Table name=\"MyTable1\" >" +

                              "    <cfgr:Column name=\"MyCol\"
type=\"string\" length=\"20\" />" +

                              "    <cfgr:Column name=\"MyCol2\"
type=\"string\" length=\"25\" />" +

                              "  </cfgr:Table>" +

                              "</xml-fragment>";

 

            // Create an XmlOptions instance and set the error listener.

             XmlOptions validateOptions = new XmlOptions();

             ArrayList errorList = new ArrayList();

             validateOptions.setErrorListener(errorList);

 

            Table tbl1 = Table.Factory.parse(sr);

            System.out.println("Parsed from String. My Table 1 name
is:\n\n" + tbl1.xgetName()+"\n");

 

System.out.println("tbl1.validate() = " +
tbl1.validate(validateOptions));

            for (int i = 0; i < errorList.size(); i++)

            {

                        XmlError error = (XmlError)errorList.get(i);

 

                        System.out.println("\n");

            System.out.println("Message: " + error.getMessage() + "\n");

                        System.out.println("Location of invalid XML: " +

                        error.getCursorLocation().xmlText() + "\n");

            }

 

 

When I run this code, I get the following output:

 

    [junit] Running com.prosrm.configurator.XmlBeanTest

    [junit] Parsed from String. My Table 1 name is:

 

    [junit] null

    [junit] tbl1.validate() = false

 

 

    [junit] Message: Expected attribute: name

 

    [junit] Location of invalid XML: <xml-fragment
xmlns:cfgr="http://prosrm.com

/configurator/xmlbeans">  <cfgr:Table name="MyTable1">    <cfgr:Column
name="MyC

ol" type="string" length="20"/>    <cfgr:Column name="MyCol2"
type="string" leng

th="25"/>  </cfgr:Table></xml-fragment>

 

 

 

    [junit] Message: Expected elements
'[EMAIL PROTECTED]://prosrm.com/configurator/xm

lbeans [EMAIL PROTECTED]://prosrm.com/configurator/xmlbeans' instead of
'[EMAIL PROTECTED]

p://prosrm.com/configurator/xmlbeans' here

 

    [junit] Location of invalid XML: <cfgr:Table name="MyTable1"
xmlns:cfgr="htt

p://prosrm.com/configurator/xmlbeans">    <cfgr:Column name="MyCol"
type="string

" length="20"/>    <cfgr:Column name="MyCol2" type="string"
length="25"/>  </cfg

r:Table>

 

 

 

 

Reply via email to