<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">

<html>
<head>
<!-- InstanceBeginEditable name="doctitle" -->
<title>Methods for Types Generated From Schema</title>
<!-- InstanceEndEditable --> 
<!--(Meta)==========================================================-->

<meta http-equiv=Content-Type content="text/html; charset=$CHARSET;">


<!-- InstanceBeginEditable name="metatags" -->

<meta name="component" content="">
<!-- In the description metatag, please provide a BRIEF description of the topic contents. -->
<meta name="description" content="">
<!-- In the component metatag, please list keywords that will help a user search for this topic. -->
<meta name="keywords" content="">
<!-- InstanceEndEditable -->

<!--(Links)=========================================================-->
<!-- InstanceBeginEditable name="head" -->
<!-- InstanceEndEditable -->
<link href="../xmlbeans.css" rel="stylesheet" type="text/css">
<a href="../../../core/index.html" id="index"></a>
<script language="JavaScript" src="../../../core/topicInfo.js"></script>
<script language="JavaScript" src="../../../core/CookieClass.js"></script>
<script language="JavaScript" src="../../../core/displayContent.js"></script>
</head>

<!--(Body)==========================================================-->
<body>
<script language="JavaScript">

</script>
<!-- InstanceBeginEditable name="body" --> 
<div id=topictitle> 
  <p class=Title>Methods for Types Generated From Schema</p>
</div>
<div id=topictext>
  <p>As you may have seen in <a href="conGettingStartedwithXMLBeans.html">Getting 
    Started with XMLBeans</a>, you use the types generated from schema to access 
    XML instances based on the schema. If you're familiar with the JavaBeans technology, 
    the conventions used in the generated API will be recognizable. </p>
  <p>In general, elements and attributes are treated as &quot;properties&quot; 
    in the JavaBeans sense. In other words, as you would with JavaBeans properties, 
    you manipulate parts of the XML through accessor methods such as getCustomer() 
    (where you have a &quot;customer&quot; element), setId(String) (where you 
    have an &quot;id&quot; attribute), and so on. However, because schema structures 
    can be somewhat complex, XMLBeans provides several other method styles for 
    handling those structures in XML instances.</p>
  <div>
    <h2>Prototypes for Methods in Generated Interfaces</h2>
    <p>Several methods are generated for each element or attribute within the 
      complex type. This topic lists each method that could be generated for a 
      given element or attribute. </p>
    <p>Note that whether or not a given method is generated is based on how the 
      element or attribute is defined in schema. For example, a customer element 
      definition with a <span class="langinline">maxOccurs</span> attribute value 
      of 1 will result in a getCustomer method, but not a getCustomerArray method 
      &#8212; after all, only one customer element is possible in an instance 
      document.</p>
    <p>Note, too, that there may be two sets of parallel methods: one whose prototype 
      starts with an &quot;x&quot;. An &quot;x&quot; method such as xgetName or 
      xsetName would be generated for elements or attribute whose type is a simple 
      type. A simple type may be one of the 44 built-in simple types or may be 
      a restriction in schema of one of those built-in types. Of course, an attribute 
      will always be of a simple type. For built-in simple types, an &quot;x&quot; 
      method will get or set one of the types provided with XMLBeans, such as 
      <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlString.html">XmlString</a></span>, 
      <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlInteger.html">XmlInteger</a></span>, 
      <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlGDay.html">XmlGDay</a></span>, 
      and so on. For derived types, the &quot;x&quot; method will get or set a 
      generated type.</p>
    <h3>Single Occurrence Methods</h3>
    <p>Methods generated for elements or attributes that allow a single occurrence. 
      An element is singular if it was declared with maxOccurs=&quot;1&quot;. 
      An attribute is singular if it was not declared with use=&quot;prohibited&quot;.</p>
    <pre>
Type getFoo()
void setFoo(Type newValue)
</pre>
  </div>
  <blockquote> 
    <div>Returns or sets the value of Foo. Generated when Foo is an attribute, 
      or is an element that can occur only once as a child.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>XmlType xgetFoo()
void xsetFoo(XmlType newValue)</pre>
  </div>
  <blockquote> 
    <div>Returns or sets the value of Foo as an XMLBean simple type. These methods 
      are generated if Foo's type is defined in schema as a simpleType.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>boolean isNilFoo()
void setNilFoo()</pre>
  </div>
  <blockquote> 
    <div>Determines or specifies whether the Foo element is nil (in other words, 
      &quot;null&quot; in schema terms), meaning it can be empty. A nil element 
      looks something like this:</div>
    <div> 
      <pre>&lt;foo/&gt;</pre>
    </div>
    <div>These methods are only generated when an element type is declared as 
      nillable in schema &#8212; it has a nillable=&quot;true&quot; attribute.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>XmlType addNewFoo()</pre>
  </div>
  <blockquote> 
    <div>Adds a new Foo as an XMLBean simple to the document, or returns Foo's 
      value if one exists already.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>boolean isSetFoo()
void unSetFoo()</pre>
  </div>
  <blockquote> 
    <div>Determines whether the Foo element or attribute exists in the document; 
      removes Foo. These methods are generated for elements and attributes that 
      are optional. In schema, and optional element has an <span class="langinline">minOccurs</span> 
      attribute set to &quot;0&quot;; an optional attribute has a <span class="langinline">use</span> 
      attribute set to &quot;optional&quot;.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <h3>Multiple Occurrence Methods</h3>
    <p>Methods generated for elements that allow multiple occurrences. </p>
    <p>An element may occur multiple times if it has a <span class="langinline">maxOccurs</span> 
      attribute set to &quot;unbounded&quot; or greater than 1. Attributes can't 
      occur multiple times.</p>
    <pre>Type[] getFooArray()
void setFooArray(Type[] newValue) </pre>
  </div>
  <blockquote> 
    <div>Returns or sets all of the Foo elements. </div>
    <div> 
      <pre>
// Get an array of the all of the purchase-order elements item children.
Item[] items = myPO.getItemArray();
</pre>
    </div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>Type getFooArray(int index)
void setFooArray(Type newValue, int index)</pre>
  </div>
  <blockquote> 
    <div>Returns or sets the Foo child element at the specified index.</div>
    <div> 
      <pre>// Sets the value of the third item child element.
myPO.setItem(newItem, 2);</pre>
    </div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>int sizeOfFooArray()</pre>
  </div>
  <blockquote> 
    <div>Returns the number of Foo child elements.</div>
    <div> 
      <pre>// Returns the number of item child elements.
int itemCount = myPO.sizeOfItemArray();</pre>
    </div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>void removeFoo(int index)</pre>
  </div>
  <blockquote> 
    <div>Removes the Foo child element at the specified index.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>XmlType[] xgetFooArray()
void xsetFooArray(XmlType[] arrayOfNewValues)</pre>
  </div>
  <blockquote> 
    <div>Returns or sets all of the Foo elements as XMLBeans simple types. Generated 
      only when the Foo element is defined as a simple type.</div>
    <div> 
      <pre>/*
 * Returns values of all the phone child elements of an employee element,
 * where the phone element has been defined as xs:string.
 */
XmlString[] empPhones = currentEmployee.xGetPhoneArray();
</pre>
    </div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>XmlType xgetFooArray(int index)
void xsetFooArray(int index, XmlType newValue)</pre>
  </div>
  <blockquote> 
    <div>Returns or sets the Foo element at the specified index, using an XMLBeans 
      simple type value. Generated for an element defined as a simple type in 
      schema.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>void insertFoo(int index, FooType newValue)</pre>
  </div>
  <blockquote> 
    <div>Inserts the specified Foo child element at the specified index.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>void addFoo(FooType newValue)</pre>
  </div>
  <blockquote> 
    <div>Adds the specified Foo to the end of the list of Foo child elements.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>XmlType insertNewFoo(int index)</pre>
  </div>
  <blockquote> 
    <div>Inserts a new Foo at the specified index, returning an XMLBeans simple 
      type representing the new element; returns the existing Foo if there's already 
      one at index.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>XmlType addNewFoo()</pre>
  </div>
  <blockquote> 
    <div>Adds a new Foo element to the end of the list of Foo child elements, 
      returning an XMLBeans simple type representing the newly added element.</div>
  </blockquote>
  <div> 
    <hr size="1">
    <pre>boolean isNilFooArray(int index)
void setNilFooArray(int index)</pre>
  </div>
  <blockquote> 
    <div>Determines or specifies whether the Foo element at the specified index 
      is nil.</div>
  </blockquote>
  <div> 
    <hr size="1">
  </div>
  <div id="topictext"></div>
  <p class=relatedtopics>Related Topics</p>
  <p><a href="conJavaTypesGeneratedFromUserDerived.html">Java Types Generated 
    from User-Derived Schema Types</a></p>
</div>
<!-- InstanceEndEditable -->
<script language="JavaScript">

</script>
</body>
</html>
