Невозможно явно указать «необязательный» внутри самого XML. Поставщик типа XML указывает на это, если он видит элемент в некоторых местах, но не другие, но это всего лишь образованное предположение.
Для явного указания, какие элементы являются необязательными, которые могут быть краткими и т. Д., Мы имеем нечто, называемое «XML-схемой», также известное как «XSD». К сожалению, поставщик типа XML не поддерживает XSD на данный момент, хотя есть an open issue for it.
Один взломанный я могу предложить вам следующее: сделать ваш корневой элемент вложенным под другим, «супер-корневым» элементом, а затем сделать два из «реальных корневых», которые позволят поставщику типа вывести необязательно- Несс. Затем поставщик типа будет генерировать для вас «супер-корневой» тип, который вы можете безотлагательно игнорировать и использовать только вложенный корень.
Конечно, поскольку поставщик типов XML, к сожалению, не поддерживает синтаксический анализ некорневых элементов, вам также придется «обертывать» текст XML в элементе «супер-root» каждый раз, когда вы его разбираете, что ограничивает решение только небольшими документами.
type Xml = XmlProvider<"""
<SuperRoot>
<RootElement>
<MandatoryElement> ... </MandatoryElement>
<OptionalElement> ... </OptionalElement>
<AnotherElement> ... </AnotherElement>
</RootElement>
<RootElement>
<MandatoryElement> ... </MandatoryElement>
<AnotherElement> ... </AnotherElement>
</RootElement>
</SuperRoot>
""">
let parse xml = (Xml.Parse ("<SuperRoot>" + xml + "</SuperRoot>")).RootElements.[0]