【问题标题】:XML Data Structure with Multiple Elements具有多个元素的 XML 数据结构
【发布时间】:2019-07-03 07:22:10
【问题描述】:

我正在尝试了解以下 XML 的结构,以便将其解析为 Excel 列。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
  <cmData type="actual">
    <header>
      <log dateTime="2019-02-08T15:05:41.000Z" action="created" appInfo="ActualExporter">InternalValues are used</log>
    </header>
    <managedObject class="AMLEPR" version="FL18_1711_06_1711_05" distName="PLMN-PLMN/MRBTS-502393/LNBTS-502393/LNCEL-10/AMLEPR-0" id="9075019">
      <defaults name="BLANK"/>
      <p name="cacHeadroom">0</p>
      <p name="deltaCac">2</p>
      <p name="maxCacThreshold">100</p>
      <p name="targetCarrierFreq">1400</p>
    </managedObject>
    <managedObject class="AMLEPR" version="FL18_1711_06_1711_05" distName="PLMN-PLMN/MRBTS-502393/LNBTS-502393/LNCEL-110/AMLEPR-0" id="9075022">
      <defaults name="BLANK"/>
      <p name="cacHeadroom">0</p>
      <p name="deltaCac">2</p>
      <p name="maxCacThreshold">100</p>
      <p name="targetCarrierFreq">2100</p>
    </managedObject>
    <managedObject class="AMLEPR" version="FL18_1711_06_1711_05" distName="PLMN-PLMN/MRBTS-502393/LNBTS-502393/LNCEL-114/AMLEPR-0" id="10755757">
      <defaults name="BLANK"/>
      <p name="cacHeadroom">0</p>
      <p name="deltaCac">2</p>
      <p name="maxCacThreshold">100</p>
      <p name="targetCarrierFreq">2300</p>
    </managedObject>
    <managedObject class="AMLEPR" version="FL18_1711_06_1711_05" distName="PLMN-PLMN/MRBTS-502393/LNBTS-502393/LNCEL-120/AMLEPR-0" id="9075025">
      <defaults name="BLANK"/>
      <p name="cacHeadroom">0</p>
      <p name="deltaCac">2</p>
      <p name="maxCacThreshold">100</p>
      <p name="targetCarrierFreq">2500</p>
    </managedObject>
      </cmData>
</raml>

我想以这样的方式解析它

我想了解如何在这个 XML 中定义子元素。我看到有多个元素具有相同的名称"p",所以每当我尝试在 MS Access 甚至 VB.net 数据集中导入它时,我都会得到一个带有"p" 的列名。

我用来更新 Access 的代码如下:

Dim cs As String
        cs = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Form1.db_txtbox.Text & "; Persist Security Info=False;"
        Dim con As New OleDb.OleDbConnection(cs)
        Using con
            Dim DelQuery As String
            Dim SqlQuery As String
            con.Open()
            DelQuery = "Delete * from LTE_AMLEPR"
            SqlQuery = "INSERT INTO LTE_AMLEPR (distName, MRBTS, LNBTS, LNCEL, AMLEPR, version, ID, cacHeadroom, deltaCac, maxCacThreshold, targetCarrierFreq) VALUES (@distName , @MRBTS, @LNBTS, @LNCEL, @AMLEPR, @version, @id, @cacHeadroom, @deltaCac, @maxCacThreshold, @targetCarrierFreq)"
            Dim da As New OleDbDataAdapter()
            Dim olecmd As OleDbCommand = New OleDbCommand(DelQuery, con)
            olecmd.ExecuteNonQuery()
            olecmd.Dispose()
            da.InsertCommand = New OleDbCommand(SqlQuery, con)
            da.InsertCommand.Parameters.Add("distName", OleDbType.VarChar, 100, "distName")
            da.InsertCommand.Parameters.Add("MRBTS", OleDbType.VarChar, 100, "MRBTS")
            da.InsertCommand.Parameters.Add("LNBTS", OleDbType.VarChar, 100, "LNBTS")
            da.InsertCommand.Parameters.Add("LNCEL", OleDbType.VarChar, 100, "LNCEL")
            da.InsertCommand.Parameters.Add("AMLEPR", OleDbType.VarChar, 100, "AMLEPR")
            da.InsertCommand.Parameters.Add("version", OleDbType.VarChar, 100, "version")
            da.InsertCommand.Parameters.Add("ID", OleDbType.VarChar, 100, "id")
            da.InsertCommand.Parameters.Add("cacHeadroom", OleDbType.VarChar, 20, "cacHeadroom")
            da.InsertCommand.Parameters.Add("deltaCac", OleDbType.VarChar, 20, "deltaCac")
            da.InsertCommand.Parameters.Add("maxCacThreshold", OleDbType.VarChar, 20, "maxCacThreshold")
            da.InsertCommand.Parameters.Add("maxCacThreshold", OleDbType.VarChar, 20, "targetCarrierFreq")
            da.Update(Dt)
        End Using

有人可以建议和解释这种 XML 结构以及我如何为这种类型的 XML 创建 XSD。

谢谢

【问题讨论】:

    标签: excel xml vba vb.net ms-access


    【解决方案1】:

    尝试 xml linq:

    Imports System.Xml
    Imports System.Xml.Linq
    Imports System.Data
    Module Module1
    
        Const FILENAME As String = "c:\temp\test.xml"
        Sub Main()
            Dim dt As New DataTable
            dt.Columns.Add("class", GetType(String))
            dt.Columns.Add("distName", GetType(String))
            dt.Columns.Add("id", GetType(String))
            dt.Columns.Add("cacHeadroom", GetType(String))
            dt.Columns.Add("deltaCac", GetType(String))
            dt.Columns.Add("maxCacThreshold", GetType(String))
            dt.Columns.Add("targetCarrierFreq", GetType(String))
    
            Dim settings As New XmlReaderSettings
            settings.DtdProcessing = DtdProcessing.Ignore
            Dim reader As XmlReader = XmlReader.Create(FILENAME, settings)
            Dim ns As XNamespace = XNamespace.Get("raml20.xsd")
    
            While (Not reader.EOF)
                If reader.Name <> "managedObject" Then
                    reader.ReadToFollowing("managedObject")
                End If
                If Not reader.EOF Then
                    Dim newRow As DataRow = dt.Rows.Add()
                    Dim managedObject As XElement = XElement.ReadFrom(reader)
    
                    newRow("class") = CType(managedObject.Attribute("class"), String)
                    newRow("distName") = CType(managedObject.Attribute("distName"), String)
                    newRow("id") = CType(managedObject.Attribute("id"), String)
                    For Each p In managedObject.Elements(ns + "p")
                        Dim attrib As String = CType(p.Attribute("name"), String)
                        Dim value As String = CType(p, String)
                        newRow(attrib) = value
    
                    Next p
    
                End If
            End While
        End Sub
    
    End Module
    

    【讨论】:

    • 感谢 jdewng。 linq 是不是比普通循环更好的选择,或者如果我在.net 中使用数据集。我尝试在 .net 中使用 ReadXML 函数,它将数据带入数据集,但数据表的创建方式不同,这就是我想了解 XML 结构的原因。您能否也为您的代码提供一些解释。感谢您的帮助
    • Linq 中的 q 代表 QUERY。所以 linq 真的是用来查询的。它不是为写入数据表中的新行而设计的。
    • Descendants 获取一个 xml 元素数组,例如 "managedObject" 。我使用 Attribute 来获取三个属性:class、distName 和 id。接下来,我得到“managedObject”中的所有“p”元素。同样,每个 p 项都有一个属性和一个值。我使用 CType 将 XElement 转换为字符串。
    • 谢谢jdweng。我尝试按照您的指示进行操作,但不会触发 for 循环。当我尝试调试时也没有错误。 managedObject 元素保持空白。因此,我将使用 Oledb 连接将数据填充到访问表中
    • XML 也有标题
    【解决方案2】:
    Sub parseXML()
    
        Dim strPath As String
        Dim strRow As String
        strPath = Application.GetOpenFilename
    
        Dim XDoc As Object
        Set XDoc = CreateObject("MSXML2.DOMDocument")
        XDoc.async = False
        XDoc.validateOnParse = False
        XDoc.Load (strPath)
        Set xObjDetails = XDoc.ChildNodes(0)
        Set xObject = xObjDetails.FirstChild
        For Each xObject In xObjDetails.ChildNodes
           strRow = xObject.Attributes(2).NodeValue & " | " & xObject.Attributes(3).NodeValue
            For Each xChild In xObject.ChildNodes
                strRow = IIf(xChild.Text <> "", strRow & " | " & xChild.Text, strRow)
            Next xChild
            Debug.Print strRow
        Next xObject
    
    End Sub
    

    【讨论】:

    • 谢谢,我认为这是在 Excel 中完成的。我真的很感谢你的帮助。如果您能解释一下,我想了解 XML 文件中的一些内容。这是任何不同类型的 XML 吗?是否可以为这种类型的 xml 创建 XSD。如果是这样,那么如何做到这一点。知道如何在 VB.net 中完成它吗?为了我的理解,您能否也解释一下代码。再次感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2015-08-23
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多