【问题标题】:XML and ASP: Retrieve and parse a remote fileXML 和 ASP:检索和解析远程文件
【发布时间】:2012-03-15 03:45:53
【问题描述】:

我正在启用 ASP 的 Windows Server 上构建站点。我需要从另一台服务器检索 XML 文档并在该文档中返回一个值。 xml 文件很小 - 只有一个带有文本值的节点。我只需要返回那个文本值。我以前从未使用过 ASP,谷歌搜索让我找到了一些代码示例,但到目前为止没有任何效果。这是我得到的,它给了我 500:

<%
Dim URL, objXML
URL = "http://someserver.com/xml"
Set objXML = Server.CreateObject("MSXML2.DOMDocument.4.0")
objXML.setProperty "ServerHTTPRequest", True
objXML.async =  False
objXML.Load(URL)

If objXML.parseError.errorCode <> 0  Then
    Response.Write(objXML.parseError.reason)
    Response.Write(objXML.parseError.errorCode)
End If

Set oRoot = objXML.selectSingleNode("//xml/response")
var = oRoot.text

set objXML = nothing
%>

<%= var %>

============

更新:

是的,您对我的 XML 的看法完全正确。只有一个具有值的节点。根据您的 cmets,我将我的 asp 代码编辑为:

<%

Dim URL, objXML, value
URL = "http://someserver.com/xml"
Set objXML = Server.CreateObject("MSXML2.DOMDocument.6.0")
objXML.setProperty "ServerHTTPRequest", True
objXML.async =  False
objXML.Load URL

Response.Write objXML.parseError.reason

value = objXML.documentElement.Text

set objXML = nothing

%>

<%= value %>

仍然返回 500。我该如何调试 ASP?有什么方法可以开启详细的错误报告吗?

【问题讨论】:

  • 如果您包含您收到的实际 Xml 会有所帮助

标签: xml asp-classic


【解决方案1】:

我写了这个函数:

<%
   Option Explicit
   Response.Buffer = True
   Dim xml
   Set xml = Server.CreateObject("Microsoft.XMLDOM")
   xml.async = False
   xml.setProperty "ServerHTTPRequest", True
   xml.Load ("http://www.midominio.com/nombre.xml")
   Dim title, heading, paragraph, testHTML
   title = xml.documentElement.childNodes(0).text
   heading = xml.documentElement.childNodes(1).text
   paragraph = xml.documentElement.childNodes(2).text
   testHTML = xml.documentElement.childNodes(3).text
   Set xml = Nothing
%>
<html>
   <head>
   <title><%= title %></title>
   </head>
   <body>
   <h3 align="center"><%= heading %></h3>
   <p align="center"><% = paragraph %></p>
   <div align="center"><%= testHTML %></div>
   </body>
</html>

【讨论】:

  • 谢谢博。 xml.documentElement.childNodes(x).text 行正是我想要的。我整个上午都在寻找同样问题的解决方案,但很难找出正确的方式来表达“VBSCRIPT read .NET simple type XML response”。
【解决方案2】:

假设您的 Xml 实际上是:-

<?xml version="1.0" ?>
<response>The value</response>

尝试使用:-

Dim value
value = objXML.documentElement.Text

顺便说一句,

当您调用不返回值的方法时,您不需要括号:-

objXML.Load Url

Response.Write objXML.parseError.reason

如果这是您的服务器,请安装 MSXML6 并使用 MSXML2.DOMDocument.6.0。如果这不是您的服务器,请使用 MSXML3.DOMDocument.3.0

【讨论】:

  • 感谢您的帮助。我添加了一些关于我的情况的更多信息 - 这仍然无法正常工作。
  • 括号注释只是风格问题,尽管 Anthony。就我个人而言,我喜欢总是将我的函数、if 语句等括起来。我不需要,但对我来说,它使它更具可读性并减少了“Doh!”的数量。我犯的错误:)
  • @Pete:这不仅仅是风格。在原始代码中使用 ( ) 没有导致语法错误的唯一原因是因为只传递了一个参数。使用 ( ) 传递 2 个或更多而不检索结果将失败。因此,通过完全避免以这种方式使用 () 将使 VBScript 代码更加一致。此外,使用 ByRef 参数的代码会以 () 中断,因为它将参数转换为表达式。最后,我更喜欢让 VB 代码看起来像 VB 代码,而不是试图让它与其他语言风格相似,这有助于突出错误。
【解决方案3】:

正如皮特·邓肯森所说,首先要尝试的是取消勾选“显示友好的错误消息”。

如果您仍然收到 500 个错误,则它们可能来自 IIS(您可以通过查看它们来判断)。如果您需要,我已经为enabling error messages on IIS7 here 提供了指南。

【讨论】:

  • 这将显示问题的行号和错误代码。虽然这不是很好的调试,但这些暗示 ASP 调试是不可能的或者您应该打开错误处理程序的答案具有误导性。
【解决方案4】:

将原始 sn-p 的第 4 行更改为

Set objXML = Server.CreateObject("MSXML2.DOMDocument.6.0")

和第 14 行到

Set oRoot = objXML.selectSingleNode("//response")

你应该没问题(假设你的 xml 和 AnthonyWJones 描述的一样)。

您原来的 //xml/response 将从看起来像这样的文档中获取文本

<?xml version="1.0" ?>
<xml>
    <response>hello</response>
</xml>

【讨论】:

    【解决方案5】:

    调试 ASP 并不像您习惯的那样愉快。不过这应该会有所帮助:

    • 如果使用 IE,请确保您已取消勾选选项中的“显示友好错误消息”
    • 使用 Response.Write's 来跟踪您通过代码的进度。

    可能是您正在使用的服务器上有一个 500 错误处理程序页面(假设您没有在本地运行)。在这种情况下,您必须尽可能修改 500 页面,以便它为您提供有关实际错误的更多详细信息(请参阅http://www.w3schools.com/ASP/asp_ref_error.asp)。如果您在本地开发,但您往往会获得所有有趣的细节。

    【讨论】:

      【解决方案6】:

      经典的 ASP 调试是一个令人讨厌的话题,多年来已经牺牲了数百万原本很好的脑细胞。即使使用用于developing 和/或supporting 经典ASP 的工具,启用调试也可以是tricky

      如果您的工作是相对较小的一次性事情,正如您的问题所暗示的那样,那么花费大量时间设置和配置高级 ASP/脚本调试环境可能没有意义。相反,根据Pete Duncanson's 的回答,只需将一些 Response.Write 语句注入到您的脚本中,并找出它在哪里以及为什么它以旧式方式失败。但是,Pete 没有指出的一件事是,您需要打开 VBScript 错误处理程序(实际上是错误吞咽器)以避免抛出未处理的异常,从而导致 IIS 为您提供 500。

      我设置并运行了以下代码,它运行良好(即没有错误)。 XML URL 指向本地计算机上与 ASP 页面相同的虚拟目录中的一个简单文件,它包含在AnthonyWJones's 答案中找到的 XML。 (顺便说一句,我不知道您是如何在原始问题中将 VBScript 格式化得这么好,所以我的副本看起来很糟糕。)

      <%
      On Error Resume Next  ' prevent tossing unhandled exception
      Dim URL, objXML, value
      URL = "http://someserver.com/xml"
      Set objXML = Server.CreateObject("MSXML2.DOMDocument.6.0")
      Response.Write "after CreateObject: " & Err.Description & "<br>"
      objXML.setProperty "ServerHTTPRequest", True
      Response.Write "after setProperty: " & Err.Description & "<br>"
      objXML.async =  False
      Response.Write "after async: " & Err.Description & "<br>"
      objXML.Load URL
      Response.Write "after Load: " & Err.Description & "<br>"
      
      Response.Write objXML.parseError.reason
      Response.Write "after write of parseError.reason: " & Err.Description & "<br>"
      
      value = objXML.documentElement.Text
      Response.Write "after setting value: " & Err.Description & "<br>"
      
      set objXML = nothing
      
      %>
      
      <%= value %>
      

      在 IE 或 Firefox 中打开它,如果一切顺利,您应该会看到:

      在 CreateObject 之后:
      在 setProperty 之后:
      异步后:
      加载后:
      在编写 parseError.reason 之后:
      设置值后:
      价值

      当然,一切都不会顺利,否则您将不会在这里,在这种情况下,您应该会看到错误详细信息出现在某个 Response.Write 值之后。这是一些关于 VBScript Err 对象的additional information

      祝你好运!

      【讨论】:

      • 不需要“on error resume next”,因为没有它,只要 IIS 设置为这样做,ASP 就会在遇到错误时转储错误、文件和行号.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2012-07-02
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多