One may annotate not every method, then the corresponding property classes and values are inferred from the method name, method return type and parameter types. For non-indicator subtag values with index 0 it's "SomeType getSomeName()", for collections - "{@link java.util.Collection}<SomeType> getSomeNames()" and "SomeType addSomeName()". (SomeType should extend {@link com.intellij.util.xml.DomElement}). For tag value the default methods are "getValue" and "setValue". The name is inferred using {@link com.intellij.util.xml.DomNameStrategy} subclasses. The default is {@link com.intellij.util.xml.HyphenNameStrategy}, which splits the camelhump name and joins the resulting words with "-". Another standard strategy is {@link com.intellij.util.xml.JavaNameStrategy}, that preserves the camel humps. Name strategy can be specified by @{@link com.intellij.util.xml.NameStrategy} annotation.
{@link com.intellij.util.xml.DomElement}'s may have implementation for some methods, that are not directly connected with XML structure. An implementation class should be abstract class implementing this interface with only needed methods. Implementation classes can be specified via @{@link com.intellij.util.xml.Implementation} annotation, or in {@link com.intellij.util.xml.DomFileDescription}.
DomElement's are created in {@link com.intellij.util.xml.DomManager}. One should register {@link com.intellij.util.xml.DomFileDescription} in {@link com.intellij.util.xml.DomManager} and provide root tag name and root {@link com.intellij.util.xml.DomElement} class. Also one can create mock DOM elements ({@link com.intellij.util.xml.DomManager#createMockElement(Class, com.intellij.openapi.module.Module, boolean)}, that are not connected with any disk XML file. One can copy contents from one DOM element to another using {@link com.intellij.util.xml.DomElement#copyFrom(com.intellij.util.xml.DomElement)} method.
{@link com.intellij.util.xml.DomElementVisitor} subclasses can have methods like "visitTypeName(TypeName element)" where TypeName is some {@link com.intellij.util.xml.DomElement} subclass. Then such methods will be called in {@link com.intellij.util.xml.DomElement#accept(com.intellij.util.xml.DomElementVisitor)}.
There's some kind of reflection, getting information about supported fixed and collection children. It's obtained via {@link com.intellij.util.xml.DomManager#getGenericInfo(java.lang.reflect.Type)} or {@link com.intellij.util.xml.DomElement#getGenericInfo()}.
Standard way of representing children with tag value only is using {@link com.intellij.util.xml.GenericDomValue}<T>, which has method T getValue().
If one has simple accessor method returning non-standard type, or GenericDomValue parameterized by non-standard type (standard types are {@link String}, {@link com.intellij.psi.PsiClass}, {@link com.intellij.psi.PsiType}, {@link Integer}, {@link Boolean}, enums), one should specify {@link com.intellij.util.xml.Converter} by @{@link com.intellij.util.xml.Convert} annotation near the method that gets this type or {@link com.intellij.util.xml.GenericDomValue}.
See our Java EE and Weblogic models for examples.