【问题标题】:Loading XML using a HTTP GET request in classic ASP在经典 ASP 中使用 HTTP GET 请求加载 XML
【发布时间】:2014-03-22 23:48:13
【问题描述】:

我正在开发一个用经典 ASP (VBScript) 编写的旧软件。

我应该创建一个进行 XSL 转换的 asp 页面。我可以使用静态文件来做到这一点,但我必须使用由 asp 页面动态生成的 XML 文件(这不起作用)。

这是我的代码:

Dim document, stylesheet, o
Set document = Server.CreateObject("Msxml2.DOMDocument")
document.async = False

Set o = CreateObject("MSXML2.XMLHTTP")
o.open "GET", "http://localhost/aaa/cgi-bin/fo/file.asp?id_x=39", False
o.send

'document.load Server.MapPath("test.xml") ' <- with static file is working
'document.loadXML(o.responseText) ' <- not working
document.load o.responseXML ' <- not working

Set stylesheet = Server.CreateObject("Msxml2.DOMDocument")
stylesheet.async = False
stylesheet.load Server.MapPath("test.xslt")

'Response.Write o.responseText ' <- working! (return the correct XML)
'Response.Write o.responseXML.xml ' <- not working (empty result)
Response.Write document.transformNode(stylesheet)

Set document = Nothing
Set stylesheet = Nothing

一切都在装有 Windows 2000 Server 的虚拟机上运行(不幸的是,我需要这样做)。

感谢您的帮助。

【问题讨论】:

    标签: xml xslt vbscript asp-classic


    【解决方案1】:

    Lankymart 的答案可能会奏效,但这是我之前使用 Bing API 的一个久经考验的示例

    <%
        Option Explicit
        Dim xml, xsl    
    
        Set xml = Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")
        xml.open "GET","http://www.yourxmlsource.com", false, "myUid", "myPassword"
        xml.send 
        Response.ContentType = "application/xml"
    
        Set xsl = Server.CreateObject("Msxml2.DomDocument.6.0")
        xsl.load(Server.Mappath("yourxslfile.xsl"))
    
        response.write xml.responseXML.transformNode(xsl)
    
        Set xsl = Nothing
        Set xml = Nothing
    %>
    

    如果您不需要发送登录信息来获取您的 XML,那么您实际上可能不需要使用 get。这是我用于 RSS 提要的内容

    <% 
      dim xml, xsl
      set xml = Server.CreateObject("Msxml2.DomDocument.6.0")
      xml.setProperty "ServerHTTPRequest", true
      xml.async = false
      xml.validateOnParse = false
      xml.load("http://rssurl.com")
    
      set xsl = Server.CreateObject("Msxml2.DomDocument.6.0")
      xsl.load(Server.Mappath("rss.xsl"))
      Response.Write(xml.transformNode(xsl))
      set xsl = nothing
      set xml = nothing 
    %>
    

    【讨论】:

    • 喜欢使用xml.setProperty "ServerHTTPRequest", true
    • @Lankymart - 只要你拉 XML。 Msxml2.ServerXMLHTTP 对象在其他情况下很有用,例如,如果您想包含来自外部 url 的 html 或 json
    • 感谢您的回答,但这只是编码问题(我也发布了我的答案)。此外,我无法在该机器上安装 MSXML 6.0,因此无法执行 Server.CreateObject("MSXML2.ServerXMLHTTP.6.0") 行。
    • @xonya - 你让它工作,这是主要的事情。关于 msxml6,我倾向于假设人们使用的是开箱即​​用的 IIS7 或更高版本,但如果您使用的是旧服务器,则可以从我的示例中的所有 server.createobject 命令中删除.6.0,它们'将使用 msxml3 代替
    【解决方案2】:

    这是一个快速测试(未经测试)。

    根据您已有的内容,我做了一些小改动。你不需要声明你的Msxml2.DOMDocument 对象,通过使用Set document = o.responseXML 你会得到同样的效果。添加了 HTTP 状态代码检查以捕获任何问题。

    看这条线;

    document.load o.responseXML
    

    这不起作用,因为Load() 方法需要一个文件位置。

    Dim document, stylesheet, o
    
    'Should be using the IServerXMLHTTPRequest object
    Set o = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
    With o
      Call .Open("GET", "http://localhost/aaa/cgi-bin/fo/file.asp?id_x=39", False)
      Call .setRequestHeader("Content-Type", "application/xml; charset=utf-8")
      Call .Send()
      If .Status = 200 Then
         Set document = o.responseXML
      Else
        'Handle errors
      End If
    End With
    
    Set stylesheet = Server.CreateObject("Msxml2.DOMDocument")
    stylesheet.async = False
    stylesheet.load Server.MapPath("test.xslt")
    
    Response.Write document.transformNode(stylesheet)
    
    Set document = Nothing
    Set stylesheet = Nothing
    

    【讨论】:

    • @AnsgarWiechers 确实可能,但是由于我在工作并且时间有限,因此对 OP 的代码进行了一些快速更改以尝试帮助他。如果有帮助,我会在 5 分钟内填写答案,我很高兴。
    • 感谢您的回答,但这只是编码问题(我也发布了我的答案)。此外,我无法在该机器上安装 MSXML 6.0,因此无法执行 Server.CreateObject("MSXML2.ServerXMLHTTP.6.0") 行。
    • @xonya 没问题,MSXML2.ServerXMLHTTP的版本无所谓,用你安装的那个就行,我就用6.0,因为它是最新的。
    【解决方案3】:

    我解决了这个问题。这是一个棘手的错误。

    Asp 从使用 ISO-8859-1 编码字符的数据库中读取数据。

    生成的 XML 包含带有重音字符 (name="unità") 的属性。 当我加载页面时,我的responseText 包含name="unit?(最后一个" 是 意外地被切断了)。所以我正在处理一个与正确文档非常相似的格式错误的 XML 文档。

    出于这个原因,它打印了responseText,而不是responseXML

    我解决了它直接更改数据库值,使用特殊字符的 url 编码。

    【讨论】:

    • 如果编码错误,就会出现格式错误,这就是编码不匹配时会发生的情况。但是由于您没有提供该信息,您希望我们如何进行第二次猜测。很高兴您设法解决了您的问题,但下次请更具描述性。
    • 抱歉,我不认为这可能是编码问题。后来我发现了。感谢您的宝贵时间。
    • 我的意思是,如果您至少提供了这个Asp reads from a database in which the chars are encoded using ISO-8859-1.,那么您可能会得到更准确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多