Чтение вложенных узлов в XML с использованием Classic ASP - PullRequest
2 голосов
/ 25 ноября 2011

Мой классический 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) Показать все ответы на этот вопрос, который является этим тегом
«questions / question / answer / user / firstName»Тэг
& 3) «Вопросы / Вопрос / Ответ / Текст» Тэг
Можно ли это сделать в Classic ASP?

Ответы [ 3 ]

2 голосов
/ 25 ноября 2011

Подход с этим заключается в использовании 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 в свои скрипты, это сэкономит вам время на поиск ошибок.
1 голос
/ 25 ноября 2011

Я смог сделать это, наконец, используя следующее, спасибо ребята за вашу помощь

<%
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 голосов
/ 25 ноября 2011

Это, конечно, возможно.

Я бы попробовал сделать это с регулярными выражениями .

Для работы с выражением существует множество онлайн-инструментов .

edit: classic asp может обрабатывать XML-документы (я неправильно думал, что он должен оставаться в виде текста, чтобы быть проанализированным) Этот пример: Traverse XML документ с использованием asp должен помочь вам и является гораздо лучшим решением, чем вариант reg ex, который я предложил (без полного обдумывания - soz)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...