我有一个XML文件,我想将其转换为VB net中使用的类。
<?xml version="1.0" encoding="windows-1252"?>
<MatML_Doc>
<Material>
<BulkDetails>
<Name>23133385</Name>
<Class>
<Name>1 - Carbon Steel</Name>
</Class>
<Source source=""/>
<PropertyData property="Material Type">
<Data format="string">IsotropicMaterial</Data>
</PropertyData>
<PropertyData property="Mass Density (RHO)_1">
<Data format="exponential">7.87e-6</Data>
</PropertyData>
<PropertyData property="Spec Organization">
<Data format="string">SAE</Data>
</PropertyData>
<PropertyData property="Spec Name">
<Data format="string">J1199</Data>
</PropertyData>
<PropertyData property="Spec Grade">
<Data format="string">CLASS 9.8</Data>
</PropertyData>
</BulkDetails>
</Material>
<Material>
<BulkDetails>
<Name>23133419</Name>
<Class>
<Name>1 - Carbon Steel</Name>
</Class>
<Source source=""/>
<PropertyData property="Material Type">
<Data format="string">IsotropicMaterial</Data>
</PropertyData>
<PropertyData property="Mass Density (RHO)_1">
<Data format="exponential">7.87e-6</Data>
</PropertyData>
<PropertyData property="Spec Organization">
<Data format="string">EN</Data>
</PropertyData>
<PropertyData property="Spec Name">
<Data format="string">10130</Data>
</PropertyData>
<PropertyData property="Spec Grade">
<Data format="string">DC05</Data>
</PropertyData>
</BulkDetails>
</Material>
...
我正在尝试将其转换为自定义类的列表:
Public Class MyMaterial
Public Name As String
Public Class As String
Public Org As String
Public Spec As String
Public Grade As String
Public Density As Double
End Class
我迷路于如何遍历xml以创建List(of MyMaterial)。目前,我正在使用stringreader一次运行条件检查以创建此列表,并通过一行。使用vb.net xml工具必须有一种更有效的方法。
解决方案
使用下面的帮助,这是对我有用的解决方案。
Dim doc As XDocument = XDocument.Load(XMLLocation)
Dim XMLMaterials As IEnumerable(Of XElement) = doc.Root.Elements("Material")
For Each XEL1 As XElement In XMLMaterials
Dim material As New MyMaterial
material.Name = XEL1.Element("BulkDetails").Element("Name").Value
material.Category = XEL1.Element("BulkDetails").Element("Class").Element("Name").Value
For Each XEL2 As XElement In XEL1.Element("BulkDetails").Elements.Where(Function(d) d.Name = "PropertyData")
If XEL2.Attribute("property").Value = "Mass Density (RHO)_1" Then
material.Density = XEL2.Value
ElseIf XEL2.Attribute("property").Value = "Spec Organization" Then
material.Org = XEL2.Value
ElseIf XEL2.Attribute("property").Value = "Spec Name" Then
material.Spec = XEL2.Value
ElseIf XEL2.Attribute("property").Value = "Spec Grade" Then
material.Grade = XEL2.Value
End If
Next
MaterialsList.Add(material)
If Not CatagoryNames.Contains(material.Category) Then CatagoryNames.Add(material.Category)
If Not Organizations.Contains(material.Org) Then Organizations.Add(material.Org)
Next
您可以使用linq to xml来读取和操作xml。为了遍历所有元素,您应该使用递归代码。
Private Sub ReadXml()
Dim xmlAll = <?xml version="1.0" encoding="windows-1252"?>
<MatML_Doc>
<Material>
<BulkDetails>
<Name>23133385</Name>
<Class>
<Name>1 - Carbon Steel</Name>
</Class>
<Source source=""/>
<PropertyData property="Material Type">
<Data format="string">IsotropicMaterial</Data>
</PropertyData>
<PropertyData Property="Mass Density (RHO)_1">
<Data format="exponential">7.87e-6</Data>
</PropertyData>
<PropertyData Property="Spec Organization">
<Data format="string">SAE</Data>
</PropertyData>
<PropertyData Property="Spec Name">
<Data format="string">J1199</Data>
</PropertyData>
<PropertyData Property="Spec Grade">
<Data format="string">CLASS 9.8</Data>
</PropertyData>
</BulkDetails>
</Material>
<Material>
<BulkDetails>
<Name>23133419</Name>
<Class>
<Name>1 - Carbon Steel</Name>
</Class>
<Source source=""/>
<PropertyData property="Material Type">
<Data format="string">IsotropicMaterial</Data>
</PropertyData>
<PropertyData Property="Mass Density (RHO)_1">
<Data format="exponential">7.87e-6</Data>
</PropertyData>
<PropertyData Property="Spec Organization">
<Data format="string">EN</Data>
</PropertyData>
<PropertyData Property="Spec Name">
<Data format="string">10130</Data>
</PropertyData>
<PropertyData Property="Spec Grade">
<Data format="string">DC05</Data>
</PropertyData>
</BulkDetails>
</Material>
</MatML_Doc>
For Each xel In xmlAll.Elements
Dim material As New MyMaterial
material.Name = xel.Element("BulkDetails").Element("Name").Value
material.Classe = xel.Element("BulkDetails").Element("Classe").Element("Name").Value
material.Org = xel.Element("BulkDetails").Elements.Where(Function(d) d.Name = "PropertyData" And d.Attribute("property").Value = "Material Type").Value
'Ect
Next
End Sub
也有将Xml序列化为类的序列化库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句