我的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,它不会进入...
答案 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