Is my XML uploaded?
No. The XML is parsed by a JavaScript parser in your browser and the classes are generated there. Nothing is sent to a server, and DTDs or external entities are never fetched. If you press Share, the link itself carries a readable copy of your input, so don't share links that contain secrets.
How does it decide between a single property and a List<T>?
An element that appears more than once under the same parent becomes a List<T>. A sample with only one item can't prove that, so the tool lists every element that appeared once and lets you tick "treat as a list" for each one.
What happens with elements that have both attributes and text, like <price currency="EUR">9.99</price>?
They become a class with an [XmlAttribute] property for each attribute and an [XmlText] Value property for the text, typed from the values (decimal here).
How are XML namespaces handled?
The root gets [XmlRoot(Namespace = "…")], classes in another namespace get [XmlType(Namespace = "…")], and elements or attributes whose namespace differs from their parent get Namespace = "…" on their attribute, so XmlSerializer reads prefixed documents such as SOAP envelopes and Atom feeds correctly.
How are types inferred?
From every value seen for an element or attribute: whole numbers become int or long, decimals become decimal, true/false become bool, and ISO 8601 dates become DateTime. Mixed values widen (int and decimal become decimal) and anything else is string. Numbers with leading zeros, such as ZIP codes, stay strings. You can turn inference off to make everything a string.
Why are optional attributes not nullable?
XmlSerializer can't serialize Nullable<T> as an attribute. For optional value-type attributes the tool adds a comment explaining the XxxSpecified pattern, which is how XmlSerializer marks an attribute as present or absent.