Toon posts:

[ASP.NET] inlezen van dynamische XML file

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik kom een vreemd probleempje tegen met ASP.NET. Ik heb een menu control die als invoer een XML file wilt hebben. Als ik gewoon een XML file aangeef is dat geen probleem. ik wil de menustructuur echter dynamisch opbouwen.
ik heb een aspx file gemaakt die XML uitspuugt. Contenttype staat goed en pagina wordt netjes gemaakt als ik die file rechtstreeks aanroep.

Wanneer die menu control de file gaat inlezen krijg ik echter een error:
XmlException: The '%' character, hexadecimal value 0x25, cannot begin a name. Line 1, position 2.]
System.Xml.XmlScanner.ScanName() +240
System.Xml.XmlScanner.ScanMarkup() +1252
System.Xml.XmlScanner.ScanToken(Int32 expected) +18
...en nog meer stack info eronder

Dit gebeurt ook wanneer ik de file inlees via de asp:xml control.
Wanneer ik de output van de dynamisch xml pagina opsla in een ander bestand en dat als bronbestand aangeef, is er geen probleem. De structuur/data is dus goed. Het lijkt erop dat ASP.NET het niet leuk vindt om dynamische xml bestanden te krijgen.

Iemand enig idee hoe dit komt en vooral wat ik eraan kan doen?

Verwijderd

Lees je hem gewoon als file in? Zo ja, dan wordt de inhoud niet geparsed, en lees je dus de source uit. Je moet een HTTP request maken.

BTW, misschien is dit veel makkelijker als Web Service te maken.

Succes :)

Verwijderd

de melding geeft het al aan :
een % op Line 1, position 2. kan maar 1 ding betekenen > in je aspx page staat iets als <% dat gebruiken we in asp.net eigenlijk niet meer.
Probeer je code te verplaatsen naar de code behind .cs file. Dus in de page_load method wat Response.Write() statements

Verwijderd

Topicstarter
In de file waar het menu staat wordt de file zo ingelezen:
CMenu.XmlDataFileName = "/PPASPnet/Data/generatemenu.aspx"

Wanener ik dit doe met een bestaande XML file (met dus dezelfde inhoud als de door generatemenu.aspx gemaakte file) is dit geen probleem.

In generatemenu.aspx staat dit:
<%@ Page Language="vb" AutoEventWireup="true" Codebehind="generatemenu.aspx.vb" Inherits="ASPNetPortal.generatemenu"%>

Dat is de enige regel. In generatemenu.aspx.vb heb ik voor het testen response.write gebruikt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            Response.Clear()
            Response.BufferOutput = True
            Response.CacheControl = "no-cache"
            Response.AddHeader("Pragma", "no-cache")
            Response.Expires = -1
            Response.ContentType = "text/xml"
            Response.Write("<?xml version='1.0' encoding='UTF-8' ?>" & vbCrLf)
            Response.Write("<MenuDate>" & vbCrLf)
            Response.Write("<Menu>" & vbCrLf)

....etc....

            Response.Write("</Menu>" & vbCrLf)
            Response.Write("</MenuDate>")
            Response.End()


BufferOutput aan of uit maakt geen verschil. Wanneer ik generatemenu.aspx gewoon open in de browser krijg ik netjes de correcte XML terug.

De exacte foutmelding die ik krijg is deze:
Exception: System.Xml.XmlException: The '%' character, hexadecimal value 0x25, cannot begin a name. Line 1, position 2. at System.Xml.XmlScanner.ScanName() at System.Xml.XmlScanner.ScanMarkup() at System.Xml.XmlScanner.ScanToken(Int32 expected) at System.Xml.XmlTextReader.SetElementValues() at System.Xml.XmlTextReader.ParseElement() at System.Xml.XmlTextReader.Read() at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) at System.Xml.XmlDocument.Load(XmlReader reader) at mintLab.webServerControls.cMenu.OnLoad(EventArgs E)

Verwijderd

ik zou zeggen, gooi die ene regel met <%@.... gewoon weg > die heb je alleen voor VStudio integratie nodig.

Verwijderd

Topicstarter
Die regel is toch noodzakelijk. Als ik die weghaal dan voert die de onderliggende code niet uit en krijg ik een lege html pagina terug.

Verwijderd

je hebt gelijk, ik moet maar eens gaan pitten denk ik > ben niet helemaal helder meer.
Is er geen menu control dat gewoon een xml stream ofzo kan ontvangen, lijkt me veel makkelijker dan deze oplossing iig.
Deze control maakt gebruik van de Load functie van xmldocument, lijkt me dat ie dan ook wel LoadXml(string xml) ondersteunt > LoadXml laadt xml van een string(die jij dan opbouwt) en niet van een reader.

Verwijderd

ah ik weet het al >> je menu geval probeert die aspx file te openen ipv de response te lezen!!

Verwijderd

Topicstarter
Zou inderdaad best kunnen, maar zou de webserver niet eerst die file moeten processen en xml als output geven? De asp:xml control geeft ook deze foutmelding. Op deze manier zou ik nooit dynamisch XML kunnen genereren.

Verwijderd

Probeer het eens met Response.BinaryWrite(), maar dan moet je eerst een byte[] van je xml-document maken.....

Waarom gebruik je geen System.Xml.XmlDocument om je xml document op te bouwen?

Verwijderd

Topicstarter
Verwijderd schreef op 04 november 2002 @ 10:40:
Waarom gebruik je geen System.Xml.XmlDocument om je xml document op te bouwen?
Heb ik ook even geprobeerd, maar liep tegen wat probleempjes aan, dus toen maar even via response.write.
Wanneer ik generatemenu.aspx gewoon open in IE of XMLSPY dan krijg ik een goede XML structuur terug.
Blijkbaar gaat het menu en de asp:xml control niet de locatie, maar de file openen.
Bij het menu kan ik alleen maar een locatie opgeven van de xml file.
Hoe kan ik nou dynamisch XML opbouwen?

Verwijderd

Je moet gewoon het hele idee van een fysieke xml file vergeten ook dat hele gedoe met een aspx om de xml te maken. Bouw een xml document in code op en stop dat in dat menu control. Moet toch geen probleem zijn.

Verwijderd

btw, welk menu control gebruik je eigenlijk?

Verwijderd

Topicstarter
Dat zou ik ook best graag willen doen, maar als enige optie kan ik een XmlDataFileName opgeven. Het laden doet die dan zelf. Ik gebruik cMenu (http://www.dev1.eraserver.net/CTRLTEST/Demo.aspx). Werkt verder goed en is 1 van de weinige componenten die freeware zijn.

Verwijderd

maar dat menu is dus dynamisch per request?

Verwijderd

Topicstarter
Bij het opbouwen van de pagina leest die de file in. Maar vreemde is dat een asp:xml control dus ook niet werkt. Als ik daar de source laat verwijzen naar dat bestand, dan probeert die ook de source te laden ipv de gegenereerde xml. Blijkbaar gaat die dus direct in de webroot dat bestandje openen ipv het eerst op te halen via de webserver.

Verwijderd

Verwijderd schreef op 04 november 2002 @ 14:08:
Bij het opbouwen van de pagina leest die de file in. Maar vreemde is dat een asp:xml control dus ook niet werkt. Als ik daar de source laat verwijzen naar dat bestand, dan probeert die ook de source te laden ipv de gegenereerde xml. Blijkbaar gaat die dus direct in de webroot dat bestandje openen ipv het eerst op te halen via de webserver.
precies, dat wil je dus niet

Verwijderd

als je nu gewoon die aspx pagina een xml file naar het filesysteem laat wegshrijven dan kun je die gebruiken voor je control.... beetje omslachtig maar het werkt wel in deze context.

Verwijderd

Topicstarter
aan die truuk zat ik ook te denken, maar menu is per persoon weer afhankelijk. Ik kan dus niet iets wegschrijven want per sessie kan dat bestand dus verschillen.
Ik probeer wel een andere oplossing te verzinnen. In elk geval bedankt voor de suggesties

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 00:15

mulder

ik spuug op het trottoir

Als je nou ietst van XmlDataFileName="<%# GetXmlFileName() %>" doet, dan genereer je in die functie een XML file en laat je die functie de naam + locatie returnen.

oogjes open, snaveltjes dicht


Verwijderd

Je kiest toch niet een property als DataFileName als deze file dynamisch opgebouwd moet worden! Dat werkt natuurlijk niet! OF je moet hier een statische file inlezen OF je neemt een andere property waarin je een XML-string kan zetten die wél dynamisch kan worden aangemaakt (met de code uit jouw aspx-bestand dus).

Gewoon System.Xml.XmlDocument gebruiken dus.

:7

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 00:15

mulder

ik spuug op het trottoir

TS heeft de property DataFilename niet gekozen, maar de maker van dat component. Er is kennelijk geen andere property.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Er is geen andere manier om xml toe tevoegen aan dat menu. Heb alleen de mogelijkheid om de sourcefile op te geven. Als het System.Xml.XmlDocument propertie was, dan zou het geen probleem zijn.

Verwijderd

uit het sessie object kan je natuurlijk het id uitlezen > noem die file zo en je kan per user een file maken Dat menu geval kijkt dan naar een file met het corresponderende sessie id en voila!. Beetje omslachtig allemaal, er moet toch wel een ander gratis comp zijn dat wel een string of stream kan ontvangen?

Je maakt gebruik van ibuyspy, daar zit al een menu in > kun je die niet gebruiken of uitbreiden?

Verwijderd

Topicstarter
Verwijderd schreef op 05 november 2002 @ 10:44:
uit het sessie object kan je natuurlijk het id uitlezen > noem die file zo en je kan per user een file maken Dat menu geval kijkt dan naar een file met het corresponderende sessie id en voila!. Beetje omslachtig allemaal, er moet toch wel een ander gratis comp zijn dat wel een string of stream kan ontvangen?
Dat is inderdaad ook een optie, alleen zou je dan voor elke gebruik een apart menu moeten maken. Ik maak inderdaad gebruik van IBuySpy (al wel behoorlijk aangepast) en daar werken ze met roles. Een user zit in 1 of meerdere roles. Per page kan ik opgeven met welke roles de gebruiker deze mag bekijken. Mooiste is dus dat die door de pagina's loopt en op basis van de roles waar de gebruiker in zit de correcte pagina's toevoegd aan het menu. Dat is opzich geen probleem met dat generatemenu.aspx. Alleen het menu componentje gaat dus zelf lokaal die file inlezen.

En veel gratis menu's heb je nou ook weer niet. In elk geval niet een complete asp.net control. Er zijn een aantal best uitgebreide systemen, maar daar betaal je dan meteen 250 dollar voor. Het valt me op dat er weinig freeware dingen zijn voor ASP.NET. Das toch wel 1 van de voordelen van PHP, veel vrij beschikbare code.
Je maakt gebruik van ibuyspy, daar zit al een menu in > kun je die niet gebruiken of uitbreiden?
Dat menu bestaat maar uit 1 laag, terwijl ik ook submenu's wil hebben.

Verwijderd

ah, als je submenus wil kun je ook dit proberen http://www.asp.net/Forums...x?tabindex=1&PostID=30927

En dat je zo voor elke sessie een file krijgt klopt helemaal, je kan het ook zo aanpakken dat er voor elke gebruiker een file gemaakt wordt want die kan je ook herkennen aan ze id.

Al met al vindt ik je oplossing niet tof, kijk goed naar het ibs framework en zie dat dit er gewoon niet lekker in past. Kijk ff naar de link en zie hoe je een sub menu inpast en klaar ben je > alle gedoe met wie wat mag zien is namelijk al door het framework geregeld.

Verwijderd

Topicstarter
Verwijderd schreef op 05 november 2002 @ 13:45:
Al met al vindt ik je oplossing niet tof, kijk goed naar het ibs framework en zie dat dit er gewoon niet lekker in past. Kijk ff naar de link en zie hoe je een sub menu inpast en klaar ben je > alle gedoe met wie wat mag zien is namelijk al door het framework geregeld.
Heb je helemaal gelijk in. Dat hele role systeem werkt best goed en zit mooi ingebakken. Ik ga eens aan de slag met de link die je gegeven hebt. Bedankt!
Pagina: 1