2011-11-25 161 views
2

我的经典ASP代码连接到一个URL,并显示XML,我的代码看起来像下面阅读嵌套节点

Response.ContentType = "text/xml" 

myRSSfile = "http://abc.com" 

Set getPage = Server.CreateObject("Microsoft.XMLHTTP") 

getPage.Open "GET", myRSSfile, false 
getPage.SetRequestHeader "Content-type", "text/xml" 
getPage.Send 

Response.Write(getPage.responseText) 
'response.write getPage.Status 

Set getPage = Nothing 

XML如下

<userContent xmlns="http://www.abc.com/userContent" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abc.com/abc.xsd"> 
<questions> 
<question> 
<item> 
<sku>SCG20056-006</sku> 
<title>Test me machine</title> 
</item> 
<text> 
We are replacing a built in machine how it would be ? 
</text> 
<dateTime>2011-11-10T22:43:02Z</dateTime> 
<answer> 
<user> 
<firstName>Raj</firstName> 
<lastName>lastname</lastName> 
</user> 
<text> 
We have been very happpy with the replacement 
</text> 
<dateTime>2011-11-21T21:00:24Z</dateTime> 
</answer> 
<answer> 
<user> 
<firstName>john</firstName> 
<lastName>wright</lastName> 
</user> 
<text> 
not so happy 
</text> 
<dateTime>2011-11-21T21:00:24Z</dateTime> 
</answer> 
</question> 
</questions> 
<comments/> 
</userContent> 

我需要做的是显示
1)“questions/question/text”标签
2)显示该问题的所有答案是这个标签
“的问题/问题/答案/用户/名字” 标签
& 3) “的问题/问题/答案/文本” 标签
是否有可能在传统的ASP办?

回答

2

采取这种方法是使用XSL在接收到的XML上执行转换以生成您想要显示的HTML。这里是一个样本,让你开始:

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:uc="http://www.abc.com/userContent" exclude-result-prefixes="uc"> 

    <xsl:output method="html" /> 

    <xsl:template match="/uc:userContent"> 
    <div class="container"> 
     <xsl:apply-templates select="uc:questions/uc:question" /> 
    </div> 
    </xsl:template> 

    <xsl:template match="uc:question"> 
    <b>Shopper asked:</b> <xsl:value-of select="uc:text" /> 
    <ul> 
     <xsl:apply-templates select="uc:answer" /> 
    </ul> 
    </xsl:template> 

    <xsl:template match="uc:answer"> 
    <li> 
     <b> 
     <xsl:value-of select="uc:user/uc:firstName" /> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="uc:user/uc:lastName" />: 
     </b> 
     <xsl:value-of select="uc:text" /> 
    </li> 
    </xsl:template> 

</xsl:stylesheet> 

你会将此XSL在你网站上打了个比方“userContent.xsl”的地方文件,为了便于举例,我们会把它放在根。

现在我们需要整理你的代码:

<% 
Option Explicit 
Dim myRSSFile: myRSSfile = "http://abc.com"  

Dim getPage: Set getPage = Server.CreateObject("MSXML2.XMLHTTPServer.3.0")  

getPage.Open "GET", myRSSfile, false   
getPage.Send  

Dim dom : dom = getPage.responseXml  
Dim xsl : Set xsl = CreateObject("MSXML2.DOMDocument.3.0") 

xsl.async = false 
xsl.load Server.MapPath("/userContent.xsl") 

%> 
<html> 
    <head> 
     <title>Some Content</title> 
    </head> 
    <body> 
    <% 
     Response.Write dom.TransformNode(xsl) 
    %> 
    </body> 
</html> 

注:

  • 不要使用XMLHTTP在ASP它不是设计在服务器中使用。
  • 当您不是发送任何内容时,没有必要在xml http请求中发送内容类型标头。
  • 如果您想操纵接收到的XML,请使用responseXml属性,该属性为您提供了一个加载的XML文档,而不是responseText。 (当然,不要使用RegEx来做到这一点)。
  • 始终在脚本中包含Option Explicit它将为您节省寻找错误的时间。
0

这当然有可能。

我试着用regular expressions来做。

要算出表达式有很多online tools

编辑:经典ASP可以处理XML文档(我错误地认为它必须继续作为文本,要解析) 这个例子:Traverse XML文件使用ASP应该帮助你,比REG一个更好的解决方案ex选项我提供了(没有完全想到它通过 - soz)

+0

我想读XML元素,表达如何定期将帮助?因为我知道正则表达式用于匹配内容不读取XML的所有元素? – user580950

+0

你可以使用正则表达式来匹配所有问题的answer.texts,例如 –

+0

不要使用正则表达式来完成这个任务,yikes! – AnthonyWJones

1

我能够这样使用下面的最后做,谢谢你们所有的帮助

<% 
Dim objxml 
Set objxml = Server.CreateObject("MSXML2.FreeThreadedDOMDocument") 
objxml.async = False 
objXML.setProperty "ServerHTTPRequest", True 
objxml.load("http://abc.com") 
set ElemUserContent=objxml.getElementsByTagName("userContent") 
set ElemQuestion=objxml.getElementsByTagName("userContent/questions/question/text") 
set ElemAnswer=objxml.getElementsByTagName("userContent/questions/question/answer") 
set ElemFirstName=objxml.getElementsByTagName("userContent/questions/question/answer/user/firstName") 
set ElemLastName=objxml.getElementsByTagName("userContent/questions/question/answer/user/lastName") 
set ElemAnswerText=objxml.getElementsByTagName("userContent/questions/question/answer/text") 
for x=0 to ElemUserContent.length-1 
response.Write("<b>A Shopper Asked:</b> "&ElemQuestion.item(x).text) 
response.Write("<ul>") 
for i=0 to ElemAnswer.length-1 
response.write("<li><b>"&ElemFirstName.item(i).text&" "&left(ElemLastName.item(i).text,1)&":</b> ") 
response.Write(ElemAnswerText.item(i).text&"</li>") 
next 
response.Write("</ul>") 
next 
%> 
+0

当有多个问题时是否需要工作,或者您是否真的打算在每个问题下重复__all__问题的答案? – AnthonyWJones

+0

我已经调整了我的答案来生成你的输出。几乎总是getElementsByTagName是这种事情的一个不好的解决方案。 – AnthonyWJones

+0

ONe问题与多个答案 – user580950