Toon posts:

[ASP/XML] Hoe "ontvang" ik een XML bestand?

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Heeft iemand een linkje of een stukje voorbeeld code hoe ik een XML bestand dat gepost wordt naar bijvoorbeeld XML_receive.asp kan ontvangen, en kan bewerken met XPATH? Liefst met XMLDOM.

Kan het XML bestand nu goed met XPATH benaderen en de goede waardes eruit krijgen, alleen nu staat het XML bestand lokaal. Straks wordt het XML bestand gepost naar de bepaalde asp pagina.

Samengevat, hoe zet ik onderstaande code om naar een code dat ik een XML bestand "gepost" toegestuurd krijg.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function getXml(xmlPath)
    dim xmlDoc
    dim isValid

    set xmlDoc = server.createObject("Microsoft.XMLDOM")
    xmlDoc.async = false
    xmlDoc.load server.mapPath(xmlPath)
    isValid = cBool(xmlDoc.parseError.errorCode = 0)
    if not isValid then
        response.write getXMLError(xmlDoc)
    end if

    set getXml = xmlDoc
end function

function getXMLError(xmlDoc)
    dim strError
    strError = "Invalid XML file!" & vbNewline & _
        "File: " & xmlDoc.parseError.url & vbNewline & _
        "Line: " & xmlDoc.parseError.line & vbNewline & _
        "Character: " & xmlDoc.parseError.linepos & vbNewline & _
        "Source Text: " & xmlDoc.parseError.srcText & vbNewline & _
        "Description: " & xmlDoc.parseError.reason
    getXMLError = strError
end function
set xmlDoc = getXml("test.xml")

path="/paymentService/notify/orderStatusEvent/@orderCode"
    set nodes=xmlDoc.selectNodes(path)
    for each x in nodes
      OrderCode= x.Text
    next
path="/paymentService/notify/orderStatusEvent/payment/paymentMethod"
    set nodes=xmlDoc.selectNodes(path)
    for each x in nodes
      PaymentMethod = x.Text
    next
path="/paymentService/notify/orderStatusEvent/payment/amount/@value"
    set nodes=xmlDoc.selectNodes(path)
    for each x in nodes
      Bedrag= x.Text
    next
path="/paymentService/notify/orderStatusEvent/payment/lastEvent"
    set nodes=xmlDoc.selectNodes(path)
    for each x in nodes
      LastEvent= x.Text
    next

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Jouw probleem valt uiteen in 2 stukken:

1) Het lezen van geposte bestanden, dit kun je eventueel zelf schrijven, je moet hiervoor Form.BinaryRead gebruiken. Maar je kunt waarschijnlijk bij hotscripts ook wel een upload script vinden voor ASP. Of anders zijn er ook nog wel upload componenten te vinden.

2) Je wilt het geuploade bestand voeren aan de xml parser. Hoe je dit doet kun je onder andere hier vinden.

Succes! :)

Verwijderd

Topicstarter
Dat voeren aan de parser gaat nou juist mis. Wat ik ervan begrijp is dat je alleen bestaande XML bestanden kunt voeren, terwijl ik juist een bestand moet voeren wat ik als POST binnen krijg

Het zou dus zoiets moeten zijn:
xmlDoc.load("binnengekomen POST") IPV xmlDoc.load("note.xml")

  • WvdWest
  • Registratie: Augustus 2002
  • Niet online
Verwijderd schreef op maandag 24 januari 2005 @ 13:48:
Dat voeren aan de parser gaat nou juist mis. Wat ik ervan begrijp is dat je alleen bestaande XML bestanden kunt voeren, terwijl ik juist een bestand moet voeren wat ik als POST binnen krijg

Het zou dus zoiets moeten zijn:
xmlDoc.load("binnengekomen POST") IPV xmlDoc.load("note.xml")
Als je loadxml(text) probeert? Zoals in de link van bigbeng staat:
Loading pure XML text into the parser
XML text can also be loaded from a text string.

The following code loads a text string into the XML parser:

<script type="text/javascript">

var text="<note>"
text=text+"<to>Tove</to><from>Jani</from>"
text=text+"<heading>Reminder</heading>"
text=text+"<body>Don't forget me this weekend!</body>"
text=text+"</note>"

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.loadXML(text)
// ....... processing the document goes here
</script>

Note that the "loadXML" method (instead of the "load" method) is used to load a text string.

[ Voor 54% gewijzigd door WvdWest op 24-01-2005 13:55 ]

I'm not a complete idiot - several parts are missing.


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je kunt tekst als XML laden met LoadXML ipv Load.
edit:

ships, te laat! :)

[ Voor 28% gewijzigd door bigbeng op 24-01-2005 13:56 ]


Verwijderd

Topicstarter
Ok, heel erg bedankt voor dit stuk, dat is nu in ieder geval duidelijk.
Nu het 1e stukje nog.

Ik krijg een Tekst/XML POST op m'n asp pagina binnen, maar hoe krijg ik deze in een tekst string? Werkt dat net als bij een gewone post? Maar dan moet je de veldnaam weten.

Tekst = Request.form("IkWeetDeVeldNaamNiet")

  • WvdWest
  • Registratie: Augustus 2002
  • Niet online
Verwijderd schreef op maandag 24 januari 2005 @ 14:15:
Ok, heel erg bedankt voor dit stuk, dat is nu in ieder geval duidelijk.
Nu het 1e stukje nog.

Ik krijg een Tekst/XML POST op m'n asp pagina binnen, maar hoe krijg ik deze in een tekst string? Werkt dat net als bij een gewone post? Maar dan moet je de veldnaam weten.

Tekst = Request.form("IkWeetDeVeldNaamNiet")
Zie http://www.w3schools.com/asp/asp_ref_request.asp Misschien sowieso een idee om w3schools als favorite te zetten.

Eerst zou ik je hele form uitschrijven met request.form zodat je de veldnaam weet. Vervolgens kan je gewoon de waarde van dit veld opvragen.

I'm not a complete idiot - several parts are missing.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
MyXMLDoc.Load Request

Werkt gewoon hoor...
Dit gebruik ik in "een pagina" om een XML Document te posten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function postXMLDoc(oDoc) {
    var xmlHTTP = getXMLHTTP();
    xmlHTTP.open('POST', 'cms/pagehelper.asp', false);
    xmlHTTP.send(oDoc);
  
    var oRes = getXMLDoc();
    oRes.loadXML(xmlHTTP.ResponseText);
    if (oRes.parseError != 0) {
        alert('Error occurred: ' + oRes.parseError.reason + '\n' + xmlHTTP.ResponseText);
        return false;
    } else {
        if (parseInt(oRes.selectSingleNode('response/error').getAttribute('code'))!=0) {
            alert('Error: ' + oRes.selectSingleNode('response/error').nodeTypedValue);
        } else {
            alert('OK');
    }
}


PageHelper.asp verwerkt dan de XML en stuurt een XML antwoord terug (voorbeeld stukje, niet relevante zooi effe vlug gestript):
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%
Response.ContentType = "text/xml"

Set oXMLRequest = Server.CreateObject("MSXML2.DomDocument")
Set oXMLResponse = Server.CreateObject("MSXML2.DomDocument")
oXMLRequest.async = false
oXMLResponse.async = false
oXMLRequest.Load Request

Set oResponseRoot = oXMLResponse.createElement("response")
Set oRequestRoot = oXMLRequest.SelectSingleNode("request")
Set oErrNode = oXMLResponse.createElement("error")
If not oRequestRoot is Nothing then
    'Doe hier je ding
End if

Set oXMLRequest = Nothing

'Set error codes
oErrNode.setAttribute "code", Err.number
oErrNode.nodeTypedValue = Err.Description
oResponseRoot.AppendChild oErrNode

'Send response
oXMLResponse.appendChild oResponseRoot
oXMLResponse.Save Response
%>


Een XML Request ziet er dus zo uit:
XML:
1
2
3
4
<request>
    ....
    ....
</request>

en een response dus:
XML:
1
2
3
4
5
<response>
    <error code="0">OK</error>
    ....
    ....
</response>

Maar daar mag je rustig andere node namen voor gebruiken en je eigen indeling van maken :Y)

[ Voor 171% gewijzigd door RobIII op 24-01-2005 14:39 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
OK, Thanks _/-\o_, ik krijg wat binnen, en het werkt allemaal al redelijk.
Alleen krijg ik nog deze fout :(

Ben al bezig geweest met REPLACE om dit eruit te filteren, want het gaat hier mis:

<!DOCTYPE paymentService PUBLIC "-//Bibit//DTD Bibit PaymentService v1//EN"
"http://dtd.bibit.com/paymentService_v1.dtd">

Krijg dan deze error.

Invalid XML file!
File: http://dtd.bibit.com/paymentService_v1.dtd
Line: 0
Character: 0
Source Text:
Description: No data is available for the requested resource.


Lees het nu in d.m.v. de xmlDoc.load Request.

Dus, laatste vraag: hoe zit dat met die DTD's? Heb ik zo'n ontzettend dik boek gekocht (van Wrox) over XML, maar dit soort dingen staan er niet in :(

Verwijderd

Topicstarter
De XML die binnenkomt moet dus nog alleen door een replace functie gehaald worden, dan is het af. Niemand die me kan helpen :*)?

Dit is de enige manier waarmee de code binnen kan komen.
code:
1
2
3
        set xmlDoc = server.createObject("Microsoft.XMLDOM")
        xmlDoc.async = false
        xmlDoc.load Request


Nu komt hij binnen, maar is er dus iets mis met dat DTD bestand, dus wil ik het liefst die regel uit het XML bestand replacen met een "".

Heb alleen geen flauw idee hoe ik dit kan doen, voordat ik 'm voer aan de xmlDoc.load. Zodra hij 'm namelijk load, krijg ik deze error:

code:
1
2
3
4
5
6
Invalid XML file!
File: http://dtd.bibit.com/paymentService_v1.dtd
Line: 0
Character: 0
Source Text:
Description: No data is available for the requested resource.

Verwijderd

Topicstarter
Het is opgelost!

Mochten er nog mensen zijn die in de toekomst hetzelfde probleem krijgen, dit is de oplossing.

Set xmlDoc= Server.CreateObject("MSXML2.DOMDocument.3.0")
xmlDoc.setProperty "ServerHTTPRequest", true

Dus MSXML2 createn ipv MSXML. Waarschijnlijk kan MSXML niet omgaan met DTS's.
Pagina: 1