Neuerlich erst verstand ich ein ungewöhnliches SprachFeature von Vb.Net-2010: die XML-Achseneigenschaften (Visual Basic) (folge dem Link)
Damit kann man direkt im VB-Code Xml-Tags mit
Auch kann man mittels
Intellisense hilft uns dann beim Erstellen differenzierter Abfragen auch komplexester Xml-Dateien.
Dadurch rückt Xml-Datenverarbeitung ein Stück weit an typisierte Datenverarbeitung heran, wie sie etwa das typisierte Dataset bereitstellt. (Es ist zwar immer noch nur ein Datentyp: String, aber immerhin schlägt Intellisense nun sinnvolle Auswahlen an Strings vor)
Hab ich malwieder ein Filmchen zu gemacht, denn wie einfach es ist, wenn Intellisense hilft, muss man gesehen haben:
- Direkt-Link
(Anmerkung: Im Film der Bildausschnitt zeigt leider vom Menü
Anmerkungen zur Abfrage-Syntax
(Beachte: untige Zeilen #14 - #22 sind austauschbare Varianten die Verschiedenes abfragen - natürlich wird nur das erste
Man kann sich die XTags innerhalb der Query als hintereinander-geschaltete Filter vorstellen, also
Das heißt es selektiert genau 3 Ebenen tief.
Ich kann auch Ebenen überspringen:
Das würde alle
(Bringt in diesem Sample keinen Unterschied, denn inne Beispiel-Xml sind die
Aber die Ebenen-Logik der Filterung versteht man vlt. anhand dieses Xml-Ausschnitts:
Hier taucht sowohl unter
Daher können wir wie folgt abfragen:
Beachte auch die annere selectete Property: Weiter oben wurde das
Damit kann man direkt im VB-Code Xml-Tags mit
<>
spezifizieren und Xml-Attribute mit @
(und noch paar annere Sachen mehr). Auch kann man mittels
Imports
-Anweisung dem Compiler das Schema der Xml-Datei bekannt machen.Intellisense hilft uns dann beim Erstellen differenzierter Abfragen auch komplexester Xml-Dateien.
Dadurch rückt Xml-Datenverarbeitung ein Stück weit an typisierte Datenverarbeitung heran, wie sie etwa das typisierte Dataset bereitstellt. (Es ist zwar immer noch nur ein Datentyp: String, aber immerhin schlägt Intellisense nun sinnvolle Auswahlen an Strings vor)
Hab ich malwieder ein Filmchen zu gemacht, denn wie einfach es ist, wenn Intellisense hilft, muss man gesehen haben:
- Direkt-Link
(Anmerkung: Im Film der Bildausschnitt zeigt leider vom Menü
Xml -> Schema erstellen
nur letzteres, aber das Xml
-HauptMenü sieht man gleich, wenn man eine XmlDatei im Editor öffnet)Anmerkungen zur Abfrage-Syntax
(Beachte: untige Zeilen #14 - #22 sind austauschbare Varianten die Verschiedenes abfragen - natürlich wird nur das erste
Return
(#14) tatsächlich ausgeführt) VB.NET-Quellcode
- Imports <xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- Public Class frmXDocDemo
- Public Sub New()
- InitializeComponent()
- ListBox1.DataSource = LoadData.ToList
- End Sub
- Private Function LoadData() As IEnumerable(Of String)
- Dim xdoc = XDocument.Load("..\..\XDocDemo.xml")
- Dim ref = xdoc.<Project>.<ItemGroup>.<Reference>(1)
- ref.@Include = "nee, dieses nich!" 'schreibzugriff aufs Include-Attribut des 2. gefundenen <Reference> - XElementes
- Return From xel In xdoc.<Project>.<ItemGroup>.<Reference> Select xel.@Include 'alle includierten References
- Return From xel In xdoc.<Project>.<ItemGroup>.<Compile> Select xel.@Include 'alle includierten Compile-Dateien
- Return From xel In xdoc.<Project>.<ItemGroup>.Elements Select xel.@Include 'alle includierten Dateien überhaupt
- Return From xel In xdoc.Descendants Where xel.@Include IsNot Nothing Select xel.@Include 'noch unspezifischer: alles includierte überhaupt
- Return From xel In xdoc.<Project>.<ItemGroup>.<Compile> Where xel.<AutoGen>.Value = "True" Select xel.@Include 'alle generierten Dateien
- Return From xel In xdoc.<Project>.<ItemGroup>.<EmbeddedResource>.<Generator> Select xel.Value 'EmbeddedResource-Generatoren
- Return From xel In xdoc.<Project>.<ItemGroup>.<None>.<Generator> Select xel.Value 'andere Generatoren
- Return From xel In xdoc.<Project>.<ItemGroup>...<Generator> Select xel.Value 'alle Generatoren
- Return New String() {}
- End Function
- End Class
xdoc.<Project>.<ItemGroup>.<Reference>
filtert aus allen <Project>
-Knoten (es gibt nur einen) alle <ItemGroup>
s, und von denen alle <Reference>
sDas heißt es selektiert genau 3 Ebenen tief.
Ich kann auch Ebenen überspringen:
xdoc.<Project>...<Reference>
Das würde alle
<Reference>
s überhaupt selektieren, hauptsache, sie liegen irgendwo unter dem <Project>
-Knoten.(Bringt in diesem Sample keinen Unterschied, denn inne Beispiel-Xml sind die
<Reference>
s alle in eine <Itemgroup>
gepackt)Aber die Ebenen-Logik der Filterung versteht man vlt. anhand dieses Xml-Ausschnitts:
XML-Quellcode
- <ItemGroup>
- <EmbeddedResource Include="frmXDocDemo.resx">
- <SubType>Designer</SubType>
- <DependentUpon>frmXDocDemo.vb</DependentUpon>
- </EmbeddedResource>
- <EmbeddedResource Include="My Project\Resources.resx">
- <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
- <LastGenOutput>Resources.Designer.vb</LastGenOutput>
- <CustomToolNamespace>My.Resources</CustomToolNamespace>
- <SubType>Designer</SubType>
- </EmbeddedResource>
- </ItemGroup>
- <ItemGroup>
- <None Include="app.config" />
- <None Include="My Project\Application.myapp">
- <Generator>MyApplicationCodeGenerator</Generator>
- <LastGenOutput>Application.Designer.vb</LastGenOutput>
- </None>
- <None Include="My Project\Settings.settings">
- <Generator>SettingsSingleFileGenerator</Generator>
- <CustomToolNamespace>My</CustomToolNamespace>
- <LastGenOutput>Settings.Designer.vb</LastGenOutput>
- </None>
- </ItemGroup>
<ItemGroup>.<EmbeddedResource>
als auch unter <ItemGroup>.<None>
der Tag <Generator>
auf. Daher können wir wie folgt abfragen:
Visual Basic-Quellcode
- Return From xel In xdoc.<Project>.<ItemGroup>.<EmbeddedResource>.<Generator> Select xel.Value 'EmbeddedResource-Generatoren
- Return From xel In xdoc.<Project>.<ItemGroup>.<None>.<Generator> Select xel.Value 'andere Generatoren
- Return From xel In xdoc.<Project>.<ItemGroup>...<Generator> Select xel.Value 'alle Generatoren
xel.@Include
-Attribut selected - hier jetzt das xel.Value
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „ErfinderDesRades“ ()