Core11: an "XML pattern" to break free from XDocument/XElement

[This post is part of a series, "wish-list for future versions of VB"]

 

IDEA: An "XML pattern". Currently we have a "collection pattern" so that For Each and "New From {...}" can be used on arbitrary user-defined types. And we also have a "query pattern" so that LINQ queries can be used on arbitrary user-defined types. We should also have an "XML pattern" so that XML literals and XML query operators can bind to arbitrary user-defined types, and also to the other XML-like tree structures provided by Microsoft.

 

SCENARIO: Silverlight. Currently we have to use the ugly workaround that we query the DOM HtmlElement tree, then convert it into XDocument/XElement so we can use XML literals/queries on it, and then convert it back. Here's the kind of code we'd like to write:

        ' XML query syntax:

        Dim doc As Windows.Browser.HtmlDocument = Windows.Browser.HtmlPage.Document

        Dim e As Windows.Browser.HtmlElement = doc.getElementById("link")

        Dim href = e.@href

        Dim children = e...<a>

        ' XML construction syntax:

        Dim e2 As Windows.Browser.HtmlElement = <b>Hello</b>

 

SCENARIO: XAML. It's common to construct XAML on-the-fly, e.g. to populate your UI based on what you get from a schema or database. At the moment you have to turn the XML literal into a stream, and then XAML has to reconstruct it from the stream. It feels ugly...

 

' current workaround for constructing XAML with XML literals:

Dim UI = <Label Name="Label1">This is turned into </Label>

Me.Content = System.Windows.Markup.XamlReader.Load(UI.CreateReader())

 

SCENARIO: User-defined data structures. Sometimes we want to construct user-defined data-structures that look like trees or lists. At the moment we can construct them with object initializers and collection initializers, but it feels like XML would be a more natural way to construct and query these structures. Note: we specifically want to store this data in our own strongly-typed classes with their own behaviors, e.g. INotifyPropertyChanged, property-validation &c: it's not adequate for us to use XML. We'd also want everything (construction as well as querying) to be strongly typed. It'd also be good if the decision about what kind of node to add could be made at runtime e.g. based on what attributes are provided.

Class Customer

Public Property Name As String

Public Property Telephone As String”

Public Orders As IEnumerable(Of Order)

End Class

Dim x As Customer = <Customer Name="Fred" Telephone="555-621-6121">

<Order Id="1234" Status="fulfilled"/>

<Order Id="5678" Status="unfulfilled"/>

</Customer>

Dim todo = From o In Customers...<Order> Where o.Status = "unfulfilled"

<Extension()> Sub AddAttribute(t As Customer, attr As String)

<Extension()> Sub AddNode(t As Customer, node As Order)

<Extension()> Sub AddAttribute(t As Order, attr As String)

<Extension()> Function Descendants(t As Customer, tag As String) As IEnumerable(Of Order)