Avatar billede pnr Nybegynder
04. april 2010 - 08:39 Der er 9 kommentarer og
1 løsning

Dårlig performance i forbindelse med xml og xslt i .net

jeg har lavet et lille test site hvor jeg henter noget data fra en webservice, som så skal renderes ved hjælp af noget xslt. Mit problem er performance, i det step hvor jeg laver mit dataset om til XmlDataDocument går det meget langsom (ca. 7 sek). Kan jeg ikke optimere det på nogen måde?

            string xsltname = "test.xslt";
            DataSet ds = [henter data fra min webservice];

            //START Her går det langsomt!!
            XmlDataDocument xmlDoc = new XmlDataDocument(ds);
            //SLUT Her går det langsomt!

            XsltSettings xslt_set = new XsltSettings();
            xslt_set.EnableScript = true;

            XsltArgumentList args = new XsltArgumentList();
            if(!string.IsNullOrEmpty(Request.QueryString["id"]))
                args.AddParam("chosenID","",Request.QueryString["id"]);

            XslCompiledTransform xslt = new XslCompiledTransform();

            xslt.Load(Server.MapPath(xsltname), xslt_set, new XmlUrlResolver());

            System.IO.StringWriter writer = new System.IO.StringWriter();
            xslt.Transform(xmlDoc, args, writer);
            skema_ltr.Text = writer.ToString().Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "");


På forhånd mange tak for hjælpen!
Avatar billede arne_v Ekspert
04. april 2010 - 13:34 #1
Kan du ændre den web service til at returnere noget mere praktisk end et DataSet ?
Avatar billede pnr Nybegynder
04. april 2010 - 14:48 #2
det kan jeg godt men hvad bør den retunere som er mere praktisk?
Avatar billede arne_v Ekspert
04. april 2010 - 15:56 #3
Jeg ville prøeve med en List<X> hvor X er en custom data klasse og så noget simpelt kode til at konvertere til XmlDocument.
Avatar billede pnr Nybegynder
20. april 2010 - 11:16 #4
Jeg vil godt starte med at undskylde at jeg ikke har svaret tilbage her før nu!!

Lad mig forklare hvordan jeg gør tingende nu, så kan du evt. fortælle mig hvordan jeg burde gøre tingende :-)

Jeg starter med at lave et "Custom" DataSet med de kolonner og navngivninger som jeg ønsker. derefter laver jeg et database udtræk af noget data, det data propper jeg så ind i mit "custom" DataSet, og så retunere jeg det via min webservice.

Grunden til at jeg gør det på ovenstående måde er på grund af følgende:
- min metode kan både bruges af webservice'en og internt.
- Jeg troede et DataSet var lige så godt som rå XML.
- Det var noget jeg kunne finde ud af :-).

Du forslår noget med en liste af custom klasser, hvad er grunden til det, istedet for bare at lave et XmlDocument ud fra det data jeg får fra mit database udtræk?

Også den sidste ting, jeg har ikke så meget erfaring med XmlDocument's, hvordan fylder jeg nemmest data i sådan størrelse?

På forhånd mange tak for svar!
Avatar billede arne_v Ekspert
21. april 2010 - 04:04 #5
Jeg synes at du konverterer alt for meget og bruger for tunge objekter.

database noget--->DataSet--->SOAP XML--->DataSet--->XML--->output

Et DataSet er en ret tung størrelse.

database noget--->List<X>--->SOAP XML--->List<X>--->XML--->output
database noget--->X[]--->SOAP XML--->X[]--->XML--->output

Er bedre fordi:
1) List<X> eller X[] er meget simplere end DataSet og langt hurtigere at konvertere
2) web servicen kan genbruges af ikke-.NET klienter

(brug List<X> hvis den i SOAP bliver til et array - ellers fald tilbage til X[])

Og hvis du ikke behøver XSLT til formatering kan du bruge:

database noget--->List<X>--->SOAP XML--->List<X>--->output

hvilket så er en konvertering mindre.

Du kan omforme en List<X> (eller X[]) til XmlDocument via XmlSerializer eller XDocument via noget ganske simpelt kode.
Avatar billede arne_v Ekspert
21. april 2010 - 04:06 #6
database noget--->XML--->SOAP XML--->XML--->output

var også en mulighed men med de simple måder at lave web service på bliver det en katastrofe fordi så får du XML pakket ind i XML.

Hvis du er super skrap til web services, SOAP og WSDL så mener jeg faktisk at det kan fungere godt.
Avatar billede pnr Nybegynder
22. april 2010 - 13:06 #7
Endnu engang tak for svar!

Hvis jeg retunere en liste med et custom objekt, så skal klienten vel også kende til mit custom object, eller hvad? og hvad hvis klienten ikke er .net, kan den så bruge det objekt til noget?
Avatar billede arne_v Ekspert
23. april 2010 - 01:05 #8
Nej.

For statisk sprog som C#, Java, C++ etc. vil de generere en egen men kompatibel udgave af klassen udfra WSDL.

For dynamisk sprog som PHP, Python etc. behøder de ikke klassen. Koden kalder bare nogle felter/metoder og hvis de ikke findes får man en fejl på runtime.

Ja.

Hvis klassen er "pæn" d.v.s. at det er en data klasse med properties af almindelige typer som int, double, string etc., så kan der nemt genereres en ekvivalent klasse i Java (properties bliver så til getters og setters).

Og det er ikke teori. Det er noget som bruges hele tiden.
Avatar billede pnr Nybegynder
23. april 2010 - 07:53 #9
Så hvis jeg lige repetere det som jeg har forstået det, så er det optimale følgende:

Jeg laver udfra mit database udtræk, en generisk liste af en pæn dataklasse og retunere denne.

Det vil jeg prøve at lege lidt med, tusid tak for hjæpen! smid et svar så vi kan afregne :-)
Avatar billede arne_v Ekspert
23. april 2010 - 18:09 #10
Jep.

Og svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester