public static <T> Reader<T> elem(
		final Function<Object[], T> generator,
		final String name,
		final Reader<?>... children
	) {
		requireNonNull(name);
		requireNonNull(generator);
		Stream.of(requireNonNull(children)).forEach(Objects::requireNonNull);

		return new ElemReader<>(name, generator, asList(children), Type.ELEM);
	}
public static < T > Reader < T > elem ( final Function < Object [ ] , T > generator , final String name , final Reader < ? > ... children ) { requireNonNull ( name ) ; requireNonNull ( generator ) ; Stream . of ( requireNonNull ( children ) ) . forEach ( Objects :: requireNonNull ) ; return new ElemReader < > ( name , generator , asList ( children ) , Type . ELEM ) ; }
Return a {@code Reader} for reading an object of type {@code T} from the
XML element with the given {@code name}.

<p>
<b>XML</b>
<pre> {@code <property name="size">1234<property>}</pre>

<b>Reader definition</b>
<pre>{@code
final Reader<Property> reader =
elem(
v -> {
final String name = (String)v[0];
final Integer value = (Integer)v[1];
return Property.of(name, value);
},
"property",
attr("name"),
text().map(Integer::parseInt)
);
}</pre>

@param generator the generator function, which build the result object
from the given parameter array
@param name the name of the root (sub-tree) element
@param children the child element reader, which creates the values
forwarded to the {@code generator} function
@param <T> the reader result type
@return a node reader
@throws NullPointerException if one of the given arguments is {@code null}
@throws IllegalArgumentException if the given child readers contains more
than one <em>text</em> reader