在xb中从xml插入到datebase

时间:2016-07-29 08:57:44

标签: xml vb.net

我的xml看起来像这样

<?xml version="1.0" standalone="yes"?>
<sdnList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/sdnList.xsd">
  <sdnEntry>
    <uid>36</uid>
    <lastName>AEROCARIBBEAN AIRLINES</lastName>
    <sdnType>Entity</sdnType>
    <programList>
      <program>CUBA</program>
    </programList>
    <akaList>
      <aka>
        <uid>12</uid>
        <type>a.k.a.</type>
        <category>strong</category>
        <lastName>AERO-CARIBBEAN</lastName>
      </aka>
    </akaList>
    <addressList>
      <address>
        <uid>25</uid>
        <city>Havana</city>
        <country>Cuba</country>
      </address>
    </addressList>
  </sdnEntry>

我用来插入的代码就像这样开始

node_list = xml_doc.SelectNodes("//sdnEntry")
        For Each node In node_list
            If CheckElement("lastName", node) <> "" Then
                sql = "INSERT INTO us_sdnentry (uid_,lastname,sdntype) VALUES "
                sql &= "('" & node.SelectNodes("./uid").Item(0).InnerText & "','" & CheckElement("lastName", node) & "','" & node.SelectNodes("./sdnType").Item(0).InnerText & "'")"
                db_sql.RunSql(sql)
            End If
            sql = "".........

问题在于,当我正在调试时,当我的程序执行时它只是跳过foreach,它不会进入...

3 个答案:

答案 0 :(得分:2)

乍一看,您的代码看起来不错,但是当您将其置于调试中时,您会发现某些内容无法正常运行。

主要问题是 xml名称空间。您可以看到如何使用名称空间来执行 XPath 查询:Problem running xpath query with namespaces

虽然我喜欢(System.Xml.Linq汇编)中的 XElement ,正如Jurgen所说,你可以开始面对你的问题:#/ p>

node_list = xml_doc.SelectNodes("//*[local-name() = 'sdnEntry']")
For Each node In node_list
     'Here your code '
Next

您可以使用local-name属性绕过命名空间问题。 因此,将XPath查询更改为:

  

//*[local-name() = 'yourtag']

您现在可以看到您的程序将开始在 For Each 中循环。

答案 1 :(得分:1)

您可以使用序列化来创建更少清晰可读的代码。

<XmlType("sdnEntry")>
Public Class Entry
    <XmlElement("uid")> Public Property Id As String  
    <XmlElement("lastName")> Public Property LastName As String
    <XmlElement("sdnType")> Public Property SdnType As String
End Class

然后将xml反序列化为List(Of Entry)

Dim serializer As New XmlSerializer(GetType(List(Of Entry)),
                                    New XmlRootAttribute("sdnList"))
Dim entryList As List(Of Entry)
Using reader As new StreamReader("yourFile.xml")
    Dim deserialized = serializer.Deserialize(reader)
    entryList = DirectCast(deserialized, List(Of Entry))
End Using

然后使用您的对象列表在数据库中插入数据

For Each item As Entry In entryList
    SaveEntry(item)
End For

Public Sub SaveEntry(data As Entry)
    Dim query As String = 
        "INSERT INTO us_sdnentry (uid_,lastname,sdntype) 
         VALUES
         (@Id, @LastName, @SdnType)"

    Dim parameters As SqlParameter() = 
    {
        New SqlParameter("@Id", data.Id),
        New SqlParameter("@LastName", data.LastName),
        New SqlParameter("@SdnType", data.SdnType),
    }

    Using conn As New SqlConnection("connectionString")
        Using command As New SqlCommand(query, conn)
            command.Parameters.AddRange(parameters)
            conn.Open()

            command.ExecuteNonQuery()
        End Using
    End Using
End Sub

答案 2 :(得分:0)

您的计划不会跳过For Each。 node_list为空(检查node_list.Count()

我不知道为什么这不起作用,因为你的XPath查询看起来不错。但是因为你没有进行任何查询而只是迭代节点。我会建议一个替代方案。

我非常喜欢XElement(System.Xml.Linq程序集)的简单性和用法

dim root = XElement.Load(fileName or stream or uri or reader)
For Each node in root.Elements("sdnEntry")
    If Not String.IsNullOrEmpty(node.Element("lastname")) Then
       ...
    End If
Next