Im trying to modify the code given in the answer to pull more information from the xml file than was originally put in but im getting some errors
[Code]
Imports System.Xml
Imports System.Xml.Linq
Imports System.IO
Public Class Form1
Public FILENAME As String = String.Empty
Public models As Model
Public productionBlocks As New Panel
Public pictureBlocks As New List(Of PictureBox)
Public gridsinfo As CubeGrid
Public dictCount As New Dictionary(Of String, Integer)
Public Sub New()
' This call is required by the designer.
InitializeComponent()
AddHandler Me.Load, AddressOf Form1_Load
' Add any initialization after the InitializeComponent() call.
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
Dim fileloader As New OpenFileDialog
fileloader.ShowDialog()
FILENAME = fileloader.FileName
models = New Model
models.Load(FILENAME)
Dim blockNames As List(Of String) = models.print.Select(Function(x) x.cubes.Select(Function(y) y.cubeBlocks.Select(Function(z) z.SubtypeName)).SelectMany(Function(y) y).ToList()).FirstOrDefault()
Dim gridSizeEnumerator As String = models.print.Select(Function(x) gridsinfo.gridSizeEnum).ToString
dictCount = blockNames.GroupBy(Function(x) x).ToDictionary(Function(x) x.Key, Function(y) y.Count)
Dim display As String = models.print2.Select(Function(x) x.cubes.Select(Function(y) y.displayname)).SelectMany(Function(y) y).ToString().First()
Dim enumer As String = models.print3.Select(Function(x) x.cubes.Select(Function(y) y.enumerator)).SelectMany(Function(y) y).ToString().First()
For Each item In dictCount
InfluenceListBox1.AddItem(item)
Next item
For Each key As String In dictCount.Keys.AsEnumerable()
TextBox1.Text = "subTypeName = '{0}', count = '{1}'" + key.ToString + dictCount(key).ToString + Environment.NewLine
Next key
If InfluenceListBox1.lstbox.Items.Item(1).ToString.Contains("Large") Then
InfluenceTextBox1.Text = "Grid Size: Large Ship"
ElseIf InfluenceListBox1.lstbox.Items.Item(1).ToString.Contains("Small") Then
InfluenceTextBox1.Text = "Grid Size: Small Ship"
End If
InfluenceTextBox2.Text = "Grid Owner: " + display.ToString
InfluenceTextBox3.Text = "Grid Size Enumerator: " + enumer.ToString
End Sub
End Class
Public Class Model
Public print As New List(Of Model)
Public print2 As New List(Of Model)
Public print3 As New List(Of Model)
Public _type As String
Public _id As ID
Public _display As String
Public _display1 As String
Public displayname As String
Public enumerator As String
Public cubes As List(Of CubeGrid)
Public info As String
Public Sub Load(filename As String)
Dim reader As New StreamReader(filename)
Dim doc As XDocument = XDocument.Load(reader)
Dim firstNode As XElement = doc.FirstNode
Dim xsiNs = firstNode.GetNamespaceOfPrefix("xsi")
Dim drawingTypes = firstNode.Elements.FirstOrDefault()
Dim drawingType = drawingTypes.Elements.FirstOrDefault()
Dim drawingStr = drawingType.Name.LocalName
print = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
._type = x.Attribute(xsiNs + "type"), ._id = x.Elements("Id").Select(Function(y) New ID() With {
.type = y.Attribute("Type"),
.subtype = y.Attribute("Subtype")
}).FirstOrDefault(),
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.id = y.Element("EntityId"),
.persistentFlags = y.Element("PersistentFlags"),
.position = y.Descendants("Position").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.forward = y.Descendants("Forward").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.up = y.Descendants("Up").Select(Function(z) New location() With {
.x = CType(z.Attribute("x"), Double),
.y = CType(z.Attribute("y"), Double),
.z = CType(z.Attribute("z"), Double)
}).FirstOrDefault(),
.orientation = y.Descendants("Orientation").Select(Function(z) New location() With {
.w = CType(z.Element("W"), Double),
.x = CType(z.Element("X"), Double),
.y = CType(z.Element("Y"), Double),
.z = CType(z.Element("Z"), Double)
}).FirstOrDefault(),
.cubeBlocks = y.Descendants("MyObjectBuilder_CubeBlock").Select(Function(z) New CubeBlock() With {
.SubtypeName = z.Element("SubtypeName")
}).ToList()
}).ToList()
}).ToList()
print2 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.displayname = y.Element("DisplayName")
}).ToList()
}).ToList()
print3 = doc.Descendants(drawingStr).Select(Function(x) New Model() With {
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With {
.enumerator = y.Element("GridSizeEnum")
}).ToList()
}).ToList()
End Sub
End Class
Public Class ID
Public type As String
Public subtype As String
End Class
Public Class CubeGrid
Public id As String
Public persistentFlags As String
Public position As location
Public forward As location
Public up As location
Public orientation As location
Public cubeBlocks As List(Of CubeBlock)
Public displayname As String
Public enumerator As String
End Class
Public Class location
Public w As Double
Public x As Double
Public y As Double
Public z As Double
End Class
Public Class CubeBlock
Public SubtypeName As String
Public username As String
End Class
[/code]
The error is when converting the label text to the display-name from string throwing an invalid casting exception i would also like to add more items such as the Grid name and grid size enumerator so i can remove the ifcontains() methods on the listbox any help would be greatly appreciated!
Try this as a start
Imports System.Xml
Imports System.Xml.Linq
Imports System.IO
Public Class Form1
Const FILENAME As String = "c:\temp\test.xml"
Public models As Model
Public productionBlocks As New Panel
Public pictureBlocks As New List(Of PictureBox)
Public dictCount As New Dictionary(Of String, Integer)
Public Sub New()
' This call is required by the designer.
InitializeComponent()
'AddHandler Me.Load, AddressOf Form1_Load
' Add any initialization after the InitializeComponent() call.
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
models = New Model
models.Load(FILENAME)
Dim blockNames As List(Of String) = models.print.Select(Function(x) x.cubes.Select(Function(y) y.cubeBlocks.Select(Function(z) z.SubtypeName)).SelectMany(Function(y) y).ToList()).FirstOrDefault()
dictCount = blockNames.GroupBy(Function(x) x).ToDictionary(Function(x) x.Key, Function(y) y.Count)
End Sub
End Class
Public Class Model
Public print As New List(Of Model)
Public _type As String
Public _id As ID
Public cubes As List(Of CubeGrid)
Public Sub Load(filename As String)
Dim reader As New StreamReader(filename)
Dim doc As XDocument = XDocument.Load(reader)
Dim firstNode As XElement = doc.FirstNode
Dim xsiNs = firstNode.GetNamespaceOfPrefix("xsi")
Dim drawingTypes = firstNode.Elements.FirstOrDefault()
Dim drawingType = drawingTypes.Elements.FirstOrDefault()
Dim drawingStr = drawingType.Name.LocalName
print = doc.Descendants(drawingStr).Select(Function(x) New Model() With { _
._type = x.Attribute(xsiNs + "type"), _
._id = x.Elements("Id").Select(Function(y) New ID() With { _
.type = y.Attribute("Type"), _
.subtype = y.Attribute("Subtype") _
}).FirstOrDefault(), _
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With { _
.id = y.Element("EntityId"),
.persistentFlags = y.Element("PersistentFlags"),
.gridSizeEnum = y.Element("GridSizeEnum"),
.position = y.Descendants("Position").Select(Function(z) New location() With { _
.x = CType(z.Attribute("x"), Double), _
.y = CType(z.Attribute("y"), Double), _
.z = CType(z.Attribute("z"), Double) _
}).FirstOrDefault(), _
.forward = y.Descendants("Forward").Select(Function(z) New location() With { _
.x = CType(z.Attribute("x"), Double), _
.y = CType(z.Attribute("y"), Double), _
.z = CType(z.Attribute("z"), Double) _
}).FirstOrDefault(), _
.up = y.Descendants("Up").Select(Function(z) New location() With { _
.x = CType(z.Attribute("x"), Double), _
.y = CType(z.Attribute("y"), Double), _
.z = CType(z.Attribute("z"), Double) _
}).FirstOrDefault(),
.orientation = y.Descendants("Orientation").Select(Function(z) New location() With { _
.w = CType(z.Element("W"), Double), _
.x = CType(z.Element("X"), Double), _
.y = CType(z.Element("Y"), Double), _
.z = CType(z.Element("Z"), Double) _
}).FirstOrDefault(), _
.cubeBlocks = y.Descendants("MyObjectBuilder_CubeBlock").GroupBy(Function(z) CType(z.Element("SubtypeName"), String)).Select(Function(z) New CubeBlock() With { _
.SubtypeName = z.Key,
.count = z.Count
}).ToList()
}).ToList()
}).ToList()
End Sub
End Class
Public Class ID
Public type As String
Public subtype As String
End Class
Public Class CubeGrid
Public id As String
Public persistentFlags As String
Public gridSizeEnum As String
Public position As location
Public forward As location
Public up As location
Public orientation As location
Public cubeBlocks As List(Of CubeBlock)
End Class
Public Class location
Public w As Double
Public x As Double
Public y As Double
Public z As Double
End Class
Public Class CubeBlock
Public SubtypeName As String
Public count As Integer
End Class
Answers to questions
1)
Now how can i use this 'dictCount
For Each key As String In dictCount.Keys.AsEnumerable()
Console.WriteLine("subTypeName = '{0}', count = '{1}'", key, dictCount(key))
Next key
2) what i did wring
Dim print2 = doc.Descendants(drawingStr).Select(Function(x) New Model() With { _
.cubes = x.Descendants("CubeGrid").Select(Function(y) New CubeGrid() With { _
.displayname = y.Element("DisplayName") _
}).ToList() _
}).ToList()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.