Sql server 经典ASP将远程XML文件导入SQL Server

Sql server 经典ASP将远程XML文件导入SQL Server,sql-server,xml,asp-classic,xml-parsing,Sql Server,Xml,Asp Classic,Xml Parsing,首先,我想说的是,我认为我的问题对于人们来说可能需要花费大量时间才能完全解决,因此我理解完全可能的是,完整的答案要求的太多了,所以任何有助于我更好理解的东西,比如:阅读材料、示例、链接,和/或建议将是伟大的,我非常感谢我收到的任何和每一个评论,好的或坏的,它只会让我和这个地方更好,最后,我想感谢你们所有人在这里所做的一切,这是一个真正的地方是由聪明的人,和关心的人 我的问题 (使用经典ASP和SQL Server) 我知道可以读取远程XML文件,然后将其插入SQL Server数据库表中。我发现

首先,我想说的是,我认为我的问题对于人们来说可能需要花费大量时间才能完全解决,因此我理解完全可能的是,完整的答案要求的太多了,所以任何有助于我更好理解的东西,比如:阅读材料、示例、链接,和/或建议将是伟大的,我非常感谢我收到的任何和每一个评论,好的或坏的,它只会让我和这个地方更好,最后,我想感谢你们所有人在这里所做的一切,这是一个真正的地方是由聪明的人,和关心的人

我的问题

(使用经典ASP和SQL Server)

我知道可以读取远程XML文件,然后将其插入SQL Server数据库表中。我发现了一个例子,它使用经典的ASP和MS Access,但可以通过最少的编码将其更改为SQL Server。URL是:

但问题是,我无法让它在我的远程XML文件上工作,我试图编辑经典的asp代码(在上面的链接中找到)好几天了,我就是无法让它以我想要的方式工作

所以我想从头开始

所涉及的XML文件位于:

我看到了几个示例,介绍了如何将整个xml文件导出到SQL Server数据库中(如执行大容量插入,请参见URL:),以及如何提取一些信息。但是我的请求有点奇怪,因为我想先检查
国家
,然后只得到
县的比率
,而不是另一个,我想对整个XML文件执行此操作

例如,xml文件如下所示:
(也可以通过单击上面的URL查看完整的xml文件)

注:
前缀
辖区\
将始终相同,只有两个字母会发生变化,
CAN
可以变成
US

另一件事是,如果国家是“CAN”,那么我想使用CAN汇率,如果是美国,我想使用美国汇率并插入该信息。使用名为“RATE”的字段输入数据库。(费率始终为小数点后4位)我想要的费率仅低于:
Special Diesel
我不需要其他费率

我最不想做的就是将
2Q2012
插入名为“Quarter”的字段中

因此,最终的SQL Server数据库如下所示(以上面的2条记录为例)

所以我试着这样做(见下面的代码),我让它显示每一行,但它甚至没有接近一个解决方案:

<% 
   Option Explicit 
   Response.Buffer = True 
   Dim xml 
   Set xml = Server.CreateObject("Microsoft.XMLDOM") 
   xml.async = False 
   xml.setProperty "ServerHTTPRequest", True 
   xml.Load ("http://www.iftach.org/TaxMatrix/charts/2Q2012.xml") 
   Dim paragraph1,paragraph2,paragraph3,paragraph4,paragraph5,paragraph6

   paragraph1 = xml.documentElement.childNodes(1).text
   paragraph2 = xml.documentElement.childNodes(2).text
   paragraph3 = xml.documentElement.childNodes(3).text
   paragraph4 = xml.documentElement.childNodes(4).text
   paragraph5 = xml.documentElement.childNodes(5).text
   paragraph6 = xml.documentElement.childNodes(6).text

   Set xml = Nothing 
%> 
<html> 
   <head> 
   <title></title> 
   </head> 
   <body> 
   <p align="center"><% = paragraph1 %></p>
   <p align="center"><% = paragraph2 %></p>
   <p align="center"><% = paragraph3 %></p>
   <p align="center"><% = paragraph4 %></p>
   <p align="center"><% = paragraph5 %></p>
   <p align="center"><% = paragraph6 %></p>
</body>
</html> 

我甚至认为将其添加到ADODB记录集中会很好,然后我会将其逐个插入SQL Server,或者只是在其中循环所有内容,但它只会显示我需要的列以及其中的行。见下面的代码:

<%
 Dim objRS
 Set objRS =  Server.CreateObject("ADODB.Recordset")
  objRS.ActiveConnection = "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.3.0;"
  objRS.Open(Server.MapPath("2Q2012.xml"))


Response.Write(objRS.Fields(2) & "<br>") ' <-- Returns the Quarter only, that I need for the Quarter Field in the DB

'Response.Write(objRS.Fields(6) & "<br>") ' <-- Returns the entire xml page

Do While Not objRS.EOF

 objRS.MoveNext
 Loop


%>

<table border="1" width="100%">
 <%
 dim fld
 Response.Write("<tr>")
 For Each fld in objRS.Fields
 If fld.Name <> "$Text" Then
 Response.Write("<td>" & fld.Name & "</td>")
 End If
 Next
 Response.Write("</tr>")
 Do While Not objRS.EOF
 Response.Write("<tr>")
 For Each fld in objRS.Fields
 If fld.Name <> "$Text" Then
 Response.Write("<td>" & fld.Value & "</td>")
 End If
 Next
 Response.Write("</tr>")
 objRS.MoveNext
 Loop
 %>
 </table>
看看这里:

您应该使用msxml对象来读取xml。然后可以使用api查询xml元素

加载xml的示例代码:

<%
dim xml : set xml = server.createobject("Msxml2.DOMDocument.6.0")
dim xmlString : xmlString = getXMLHTTPResponse("http://www.iftach.org/TaxMatrix/charts/2Q2012.xml")
xml.loadxml(xmlString)

function getXMLHTTPResponse(url)
    dim tout, xmlhttp

    set xmlhttp = server.createObject("Msxml2.ServerXMLHTTP.6.0")
    with xmlhttp
        .setTimeouts 2000, 2000, 2000, 2000
        .open "GET", url, false
        .send()
        if .responseXML.xml = "" then
            getXMLHTTPResponse = .responseText
        else
            getXMLHTTPResponse = .responseXML.xml
        end if
    end with
end function
%>

看看这里:

您应该使用msxml对象来读取xml。然后可以使用api查询xml元素

加载xml的示例代码:

<%
dim xml : set xml = server.createobject("Msxml2.DOMDocument.6.0")
dim xmlString : xmlString = getXMLHTTPResponse("http://www.iftach.org/TaxMatrix/charts/2Q2012.xml")
xml.loadxml(xmlString)

function getXMLHTTPResponse(url)
    dim tout, xmlhttp

    set xmlhttp = server.createObject("Msxml2.ServerXMLHTTP.6.0")
    with xmlhttp
        .setTimeouts 2000, 2000, 2000, 2000
        .open "GET", url, false
        .send()
        if .responseXML.xml = "" then
            getXMLHTTPResponse = .responseText
        else
            getXMLHTTPResponse = .responseXML.xml
        end if
    end with
end function
%>

最后!!!我成功了,如果有人需要解决方案,请参见以下内容: 使用我在问题中发布的代码,我添加了以下代码:

注意:我知道这不是最好的方法,因为我不去寻找标记/id/名称,但xml文件的格式将始终保持不变,所以我只是循环,剪切我需要的内容,并插入/更新到数据库中

    <%
    ' LOOP ALL OF THE FIELDS ONE BY ONE
     For x = 0 to xml.documentelement.childnodes.length - 1
     set XMLobjchildnodes = xml.documentelement.childnodes
     strXMLtxt=xml.documentElement.childNodes(x).text & "<br>"


    ' SETUP THE UPDATE FIELDS FOR SQL
     dim strTest
     strTest="objSQL(""IMP_STATE_" & Mid(strXMLtxt,1,2) & """)=" & Mid(strXMLtxt,46,7)

    ' SKIP THE Fi and 2Q because they are not States/Prov.
    if strTest="objSQL(""IMP_STATE_Fi"")=" OR strTest="objSQL(""IMP_STATE_2Q"")=" then
    else

    ' ALSO SKIP hi and U and CN because they also are not States/Prov.
    if InStr(strTest,"STATE_ht")>0 OR InStr(strTest,"STATE_U.")>0 OR InStr(strTest,"STATE_CN")>0 then
    else

    ' ADD YOUR SQL CONNECTION INFO. HERE AND THEN INSERT/UPDATE THE SQL DB


    end if
Next
    %>
0或InStr(strTest,“STATE”)>0或InStr(strTest,“STATE”)>0
其他的
'添加您的SQL连接信息。在此处插入/更新SQL数据库
如果结束
下一个
%>
注意:通过进行小的更改,您可以将其设置为将数据插入SQL和/或更新,如果这对任何人都有问题,请告诉我,我将非常乐意提供帮助


对于所有试图解决我的问题的人,非常感谢你们的辛勤工作和努力。

最后!!!我成功了,如果有人需要解决方案,请参见以下内容: 使用我在问题中发布的代码,我添加了以下代码:

注意:我知道这不是最好的方法,因为我不去寻找标记/id/名称,但xml文件的格式将始终保持不变,所以我只是循环,剪切我需要的内容,并插入/更新到数据库中

    <%
    ' LOOP ALL OF THE FIELDS ONE BY ONE
     For x = 0 to xml.documentelement.childnodes.length - 1
     set XMLobjchildnodes = xml.documentelement.childnodes
     strXMLtxt=xml.documentElement.childNodes(x).text & "<br>"


    ' SETUP THE UPDATE FIELDS FOR SQL
     dim strTest
     strTest="objSQL(""IMP_STATE_" & Mid(strXMLtxt,1,2) & """)=" & Mid(strXMLtxt,46,7)

    ' SKIP THE Fi and 2Q because they are not States/Prov.
    if strTest="objSQL(""IMP_STATE_Fi"")=" OR strTest="objSQL(""IMP_STATE_2Q"")=" then
    else

    ' ALSO SKIP hi and U and CN because they also are not States/Prov.
    if InStr(strTest,"STATE_ht")>0 OR InStr(strTest,"STATE_U.")>0 OR InStr(strTest,"STATE_CN")>0 then
    else

    ' ADD YOUR SQL CONNECTION INFO. HERE AND THEN INSERT/UPDATE THE SQL DB


    end if
Next
    %>
0或InStr(strTest,“STATE”)>0或InStr(strTest,“STATE”)>0
其他的
'添加您的SQL连接信息。在此处插入/更新SQL数据库
如果结束
下一个
%>
注意:通过进行小的更改,您可以将其设置为将数据插入SQL和/或更新,如果这对任何人都有问题,请告诉我,我将非常乐意提供帮助


对于所有试图解决我的问题的人,非常感谢你们的辛勤工作和努力。

对于可能在这里复制技术的其他人,请不要这样做。从外来源中吸收XML并将其包含到SQL代码中然后执行是一件危险的事情。@AnthonyWJones我同意这是一件非常危险的事情,所以始终使用参数化查询。更多信息。关于参数化查询和存储过程,您可以在此处阅读,或者更好的方法是在stackoverflow中搜索参数化查询。对于可能在此处复制此技术的其他人,请注意:不要。从外来源中吸收XML并将其包含到SQL代码中然后执行是一件危险的事情。@AnthonyWJones我同意这是一件非常危险的事情,所以始终使用参数化查询。更多信息。关于参数化查询和s
    <%
    ' LOOP ALL OF THE FIELDS ONE BY ONE
     For x = 0 to xml.documentelement.childnodes.length - 1
     set XMLobjchildnodes = xml.documentelement.childnodes
     strXMLtxt=xml.documentElement.childNodes(x).text & "<br>"


    ' SETUP THE UPDATE FIELDS FOR SQL
     dim strTest
     strTest="objSQL(""IMP_STATE_" & Mid(strXMLtxt,1,2) & """)=" & Mid(strXMLtxt,46,7)

    ' SKIP THE Fi and 2Q because they are not States/Prov.
    if strTest="objSQL(""IMP_STATE_Fi"")=" OR strTest="objSQL(""IMP_STATE_2Q"")=" then
    else

    ' ALSO SKIP hi and U and CN because they also are not States/Prov.
    if InStr(strTest,"STATE_ht")>0 OR InStr(strTest,"STATE_U.")>0 OR InStr(strTest,"STATE_CN")>0 then
    else

    ' ADD YOUR SQL CONNECTION INFO. HERE AND THEN INSERT/UPDATE THE SQL DB


    end if
Next
    %>