2012-06-20 2 views
2

Прежде всего, я хотел бы сказать, что я думаю, что мой вопрос может занять много времени, чтобы люди могли его решить в полном смысле, поэтому я понимаю, что вполне возможно, что полный ответ слишком много просит, поэтому все, что поможет мне лучше понять, например: чтение материалов, примеров, ссылок и/или советов, было бы замечательно, и я очень ценю любые комментарии, которые я получаю, хорошие или плохие, просто делает меня и это место намного лучше, наконец, я хотел бы поблагодарить всех вас за все, что вы здесь делаете, это действительно место, которое было создано умными людьми и людьми, которые заботятся.Классический ASP Импорт удаленного XML-файла в SQL Server

МОЙ ВОПРОС

(используя классический ASP и SQL Server)

Я знаю, что можно прочитать удаленный файл XML, а затем вставьте его в таблицу базы данных SQL Server. Я нашел один пример, который использует классический ASP и MS Access, но который можно изменить на SQL Server с минимальным кодированием URL: http://forums.aspfree.com/code-bank-54/classic-asp-import-remote-xml-file-into-database-152966.html

Но проблема в том, что я не могу заставить его работать с моим удаленным XML-файлом , Я пытался изменить классический код asp (найденный в ссылке выше) в течение нескольких дней и дней, и я просто не могу заставить его работать так, как хотелось бы.

Так что я хочу, чтобы начать с самого начала,

файл XML в вопрос находится на: http://www.iftach.org/taxmatrix/charts/2Q2012.xml

Я видел пару примеров того, как вы можете экспортировать весь файл XML в SQL Server (например, вставьте BULK insert, см. URL: http://support.microsoft.com/kb/316005), а также о том, как извлечь некоторую информацию. из XML, но мой запрос нечетный, так как я хочу сначала проверить Country, а затем получить только Counties Rate, а не другой, я хочу сделать это для всего XML-файла.

Например, файл XML является чем-то вроде этого:
(или вы можете просмотреть полный файл XML, нажав на указанную ссылку)

<FILE> 
<QUARTER>2Q2012</QUARTER> 
<RECORD> 
<JURISDICTION ID="#15">AB</JURISDICTION> 
<COUNTRY>CAN</COUNTRY> 
...... 
...... 
<RATE RATECHANGE="0" COUNTRY="US">0.3366</RATE> 
<RATE RATECHANGE="0" COUNTRY="CAN">0.0900</RATE> 
...... 
...... 
...... 
</RECORD> 

<RECORD> 
<JURISDICTION ID="#15">FL</JURISDICTION> 
<COUNTRY>U.S.</COUNTRY> 
...... 
...... 
<RATE RATECHANGE="0" COUNTRY="US">1.5700</RATE> 
<RATE RATECHANGE="0" COUNTRY="CAN">1.3210</RATE> 
...... 
...... 
...... 
</RECORD> 
</FILE> 

и так далее ....

Теперь я хотел бы вставить эту информацию в таблицу SQL Server под названием FFTR и назвать конкретный столбец для каждого JURISDICTION

Как, например, приведенное выше было бы:

Field Name 1 --> "JURISDICTION_AB_CAN" 
Field Name 2 --> "JURISDICTION_FL_US" 
and so on... 

ПРИМЕЧАНИЕ:
Приставка JURISDICTION_ всегда будет такой же, только две буквы, изменится и CAN может стать US.

Другое дело, если COUNTRY «CAN», то я бы хотел использовать CAN Rate, и если это U.S., я бы хотел использовать US Rate и вставить эту информацию. в базу данных с полем «RATE». (Скорость всегда будет 4 знака после запятой). Тариф, который я хочу, находится только под: <FUEL_TYPE>Special Diesel</FUEL_TYPE> Мне не нужны другие тарифы.

И последнее, что я хотел бы сделать это, чтобы иметь <QUARTER>2Q2012</QUARTER> вставляется в поле под названием «Квартал»

Таким образом, окончательный базы данных SQL Server будет выглядеть следующим образом (используя 2 записи в качестве примера выше)

Field Name: JURISDICTION_AB_CAN 
Rate: 0.0900 
Quarter: 2Q2012 

Field Name: JURISDICTION_FL_US 
Rate: 1.5700 
Quarter: 2Q2012 

Так что я пытался сделать это (см код ниже), и я получил его, чтобы показать каждую строку, но она даже не приблизиться к решению:

<% 
    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 Recordset было бы здорово, а потом я бы вставлял его в 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> 

Again, Большое вам спасибо за любые советы, ссылки, или любая помощь на всех ...

ответ

0

Наконец !!! Я сделал это, если кто-то нуждается в решении, это ниже: Используя код, который я опубликовал в вопросе, я добавил следующий код:

Примечание: Я знаю, что это не лучший способ сделать это, m не идет после TAGS/IDs/Names, но xml-файл всегда останется таким же, что и я, просто Looped, вырежу то, что мне нужно, и вставил/обновил в БД.

<% 
    ' 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 
    %> 

Примечание: Делая небольшие изменения, которые вы можете установить его вставить данные в SQL и/или обновление, это должно быть проблемой для тех, кто, пожалуйста, дайте мне знать, я буду более чем счастлив помочь.

Всем, кто пытался решить мою проблему/вопрос, большое спасибо за всю вашу тяжелую работу и усилия.

+1

В интересах других, которые могут копировать технику здесь: не делайте этого. Сосать XML из иностранного источника и конкатенировать его с SQL-кодом, который затем выполняется, является рискованным делом. – AnthonyWJones

+0

@ AnthonyWJones Я согласен, что это очень рискованная вещь, поэтому всегда используйте параметризованный запрос. Для получения дополнительной информации. по параметризованным запросам и хранимым процедурам вы можете прочитать здесь: http://palizine.plynt.com/issues/2006Jun/injection-stored-procedures/ или даже лучше просто искать stackoverflow для параметра Parameterized query – compcobalt

0

посмотрите здесь: msxml DOM

вы должны использовать MSXML объект для чтения xml. то вы можете запросить элементы xml с помощью api.

пример кода для загрузки 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 
%> 
Смежные вопросы