2009-06-15 8 views
1

ich unter SQL Server-Code zu VBScript in klassischen ASP konvertieren wollen ...Convert SQL-Code, XML/XPath zu VBScript verwendet (klassische ASP)

DECLARE @idoc int 
DECLARE @xdoc nvarchar(4000) 
DECLARE @xmldoc xml 
Set @xmldoc = '<Root><Authors au_id="409-56-7008" au_lname="Bennet" au_fname="Abraham"><Titles title="The Busy Executive&apos;s Database Guide"/></Authors><Authors au_id="648-92-1872" au_lname="Blotchet-Halls" au_fname="Reginald"><Titles title="Fifty Years in Buckingham Palace Kitchens"/></Authors><Authors au_id="238-95-7766" au_lname="Carson" au_fname="Cheryl"><Titles title="But Is It User Friendly"/></Authors><Authors au_id="722-51-5454" au_lname="DeFrance" au_fname="Michel"><Titles title="The Gourmet Microwave"/></Authors><Authors au_id="712-45-1867" au_lname="del Castillo" au_fname="Innes"><Titles title="Silicon Valley Gastronomic Treats"/></Authors><Authors au_id="427-17-2319" au_lname="Dull" au_fname="Ann"><Titles title="Secrets of Silicon Valley"/></Authors><Authors au_id="267-41-2394" au_lname="Ellis" au_fname="Michael"><Titles title="Cooking with Computers: Surreptitious Balance Sheets"/><Titles title="Sushi for Anyone"/></Authors><Authors au_id="213-46-8915" au_lname="Green" au_fname="Marjorie"><Titles title="The Busy Executive&apos;s Database Guide"/><Titles title="You Can Combat Computer Stress"/></Authors></Root>' 

SELECT 
Authors.value('./@au_id', 'varchar(20)') as au_id, 
Authors.value('./@au_fname', 'varchar(20)') as au_fname, 
Authors.value('./@au_lname', 'varchar(20)') as au_lname, 
Authors.value('Titles[1]/@title', 'varchar(20)') as Title 
FROM 
@xmldoc.nodes('/Root/Authors') as TableValues(Authors) 

Wie schreiben Sie den obigen Code in klassischen ASP (VBScript)

Können Sie mir dabei helfen?

Antwort

3
<% 

Dim xmldoc 
Set xmldoc = Server.CreateObject("MSXML2.DOMDocument.4.0") 

xmldoc.SetProperty "SelectionLanguage", "XPath" 
''# note the escaped double quotes 
xmldoc.LoadXml "<Root><Authors au_id=""409-56-7008"" au_lname=""Bennet"" au_fname=""Abraham""><Titles title=""The Busy Executive&apos;s Database Guide""/></Authors><Authors au_id=""648-92-1872"" au_lname=""Blotchet-Halls"" au_fname=""Reginald""><Titles title=""Fifty Years in Buckingham Palace Kitchens""/></Authors><Authors au_id=""238-95-7766"" au_lname=""Carson"" au_fname=""Cheryl""><Titles title=""But Is It User Friendly""/></Authors><Authors au_id=""722-51-5454"" au_lname=""DeFrance"" au_fname=""Michel""><Titles title=""The Gourmet Microwave""/></Authors><Authors au_id=""712-45-1867"" au_lname=""del Castillo"" au_fname=""Innes""><Titles title=""Silicon Valley Gastronomic Treats""/></Authors><Authors au_id=""427-17-2319"" au_lname=""Dull"" au_fname=""Ann""><Titles title=""Secrets of Silicon Valley""/></Authors><Authors au_id=""267-41-2394"" au_lname=""Ellis"" au_fname=""Michael""><Titles title=""Cooking with Computers: Surreptitious Balance Sheets""/><Titles title=""Sushi for Anyone""/></Authors><Authors au_id=""213-46-8915"" au_lname=""Green"" au_fname=""Marjorie""><Titles title=""The Busy Executive&apos;s Database Guide""/><Titles title=""You Can Combat Computer Stress""/></Authors></Root>" 

Dim Author 

Response.Write "<table>" & vbNewLine 
For Each Author In xmldoc.SelectNodes("/Root/Authors") 
    Response.Write "<tr>" & vbNewLine 
    WriteTableCell Author.GetAttribute("au_id") 
    WriteTableCell Author.GetAttribute("au_fname") 
    WriteTableCell Author.GetAttribute("au_lname") 
    WriteTableCell Author.SelectSingleNode("Titles[1]/@title") 
    Response.Write "</tr>" & vbNewLine 
Next 
Response.Write "</table>" & vbNewLine 

''# table cell output factored into a Sub, for reuse and cleaner code 
Sub WriteTableCell(xmldata) 
    Dim s 

    If IsObject(xmldata) Then 
    If xmldata Is Nothing Then 
     s = "" 
    Else 
     s = xmldata.text 
    End If 
    Else 
    s = CStr(xmldata) 
    End If 

    Response.Write "<td>" & Server.HTMLEncode(s) & "</td>" & vbNewLine 
End Sub 

%> 

getestet, funktioniert.

+0

tolle Arbeit Tomalak! –

+0

+1. Schön gemacht. Ein paar Vorschläge. Verwenden Sie MSXML3.DOMDocument.3.0 (Ich bin auf Computer gestoßen, auf denen ihre Registries durch eine fehlerhafte Installation von MSXML2 gestört wurden, was dazu führte, dass die nicht qualifizierte ProgID eine MSXML2-Implementierung zurückgab, obwohl MSXML3 installiert war). Sekunde s = "" bewirkt, dass der TD nicht rendert, ein Leerzeichen sollte den Trick machen s = ChrW (8239) – AnthonyWJones

+0

Meines Wissens gibt es so etwas wie "MSXML3" nicht. Jede Version bis 6.0 verwendet "MSXML2" in der ProgId. (http://msdn.microsoft.com/en-gb/library/ms764622.aspx). Ich nehme an, dass dies nur ein Tippfehler von Ihrer Seite ist. :-) Ich werde es ändern, um 4.0 zu verwenden, das weit verbreitet und verfügbar sein sollte, auch ist es mehr als genug für die vorliegende Arbeit. In Bezug auf das 's = ""' - die Zelle wird einfach nicht angezeigt, was einfach mit CSS und 'empty-cells: show;' in einem einigermaßen modernen Browser. Auch das tragbare nbsp ist Chr (160), IMHO. – Tomalak

3

Ich würde vorschlagen, diese Logik in eine gespeicherte Prozedur einzukapseln. Dann rufen Sie einfach diesen Sproc von Ihrer klassischen ASP-Seite auf. Sie werden viel zu viel Zeit damit verbringen, diese Logik von den in SQL Server eingebauten XML-Parsing-Funktionen in VBScript umzuwandeln. VBScript verfügt nicht über umfangreiche Funktionen zum Analysieren von XML-Dokumenten.

Verwenden Sie das beste Tool für den Job. Wenn es eine Verwaltungseinschränkung gibt, versuchen Sie vielleicht, an den Sinn für geistige Gesundheit von jemandem zu appellieren. Ich weiß, dass dies Ihre spezifische Frage nicht beantwortet, wie Sie es erwartet haben könnten.

Create Procedure GetAuthors 

AS 
    DECLARE @idoc int , 
      @xdoc nvarchar(4000) , 
      @xmldoc xml 

    SELECT @xmldoc = '' 


    SELECT Authors.value('./@au_id', 'varchar(20)') as au_id, 
    Authors.value('./@au_fname', 'varchar(20)') as au_fname, 
    Authors.value('./@au_lname', 'varchar(20)') as au_lname, 
    Authors.value('Titles[1]/@title', 'varchar(20)') as Title 
    FROM @xmldoc.nodes('/Root/Authors') as TableValues(Authors) 
Verwandte Themen