xml - 如何使用 VB .net 解析 XML

标签 xml vb.net

我有一个 XML 文件,我想将其转换为一个类以在 VB 网络中使用。

<?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 以创建一个列表(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 序列化为类的序列化库。

关于xml - 如何使用 VB .net 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460165/

相关文章:

c# - 如何在 XSLT 中进行循环?

xml - XML 元素的自定义排序

vb.net - 使用VB.NET发布ClickOnce安装报错 "Exception reading from manifest"

vb.net - 发送电子邮件时从右到左

html - 使用 SQL FOR XML 创建 HTML 表

python - 解析 XML Python

asp.net - 如何在 Web 服务器控件中嵌入静态图像资源?

c# - 如何从 C# 或 VB.Net 使用 Win32 'DwmSetIconicThumbnail'?

asp.net - 在asp.net中使用VB检查网页是否在线

使用Golang解析XML(滥用实体属性)