如何使用VB .net解析XML

4
我有一个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以创建一个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
2个回答

2

你可以使用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文件的正确方法是什么?我尝试加载XMLDocument类型,但一直出现找不到成员的错误。 - Todd
@Todd - 使用 XDocument 类加载您的文件。 - Chris Dunaway

1
这个答案更适合问题:如何解析XML文件以创建VB.net类。 您可以使用Visual Studio开发工具中的xsd.exe工具从XML文件自动生成VB类。
您需要打开Dev命令提示符来运行该工具。从Visual Studio内部打开命令提示符 VS 2013的命令提示符的默认位置是此处,但这可能根据安装位置而改变。
在命令提示符中运行以下命令:

xsd 'yourfilename'.xml /classes /language:vb

例子: 在这里输入图像描述 这将自动生成XML方案文件“yourfilename.xsd”并保存到目录文件夹中。
然后运行以下命令:

xsd 'yourfilename'.xsd /classes /language:vb

例子: 在这里输入图像描述 这将从XSD文件中自动生成一个VB类,该类将包含在名为“yourfilename.vb”的VB文件中。
然后,您可以将带有类的VB文件简单地添加到项目中。
一旦将此类添加到项目中,您就可以轻松地遍历类的节点。

1
这个回答值得更多的赞。虽然xsd并不是很好,但在xml文件上使用类是一个好主意。 - tmighty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接