Avatar billede peter_svendsen Nybegynder
12. oktober 2006 - 11:46 Der er 30 kommentarer

XML specialtegn som &

Er der en medfølgende funktion der konvertere min string til XML godtaget tekst. Altså & --> &amp; < --> &lt; osv.

Jeg ved godt det ville være simpelt at lave funktionen selv, men hvis funktionen allerede er i .NET platformen kan jeg jo' lige så godt bruge den.
Avatar billede dr_chaos Nybegynder
12. oktober 2006 - 12:09 #1
Noget i denne stil:
xmldocument xd = new xmldocument();
XmlDeclaration xmldecl;
xmldecl = xd.CreateXmlDeclaration("1.0", System.Text.Encoding.UTF8.WebName, null);
xd.AppendChild(xmldecl);
xd.load(dinstreng);
Avatar billede peter_svendsen Nybegynder
12. oktober 2006 - 12:13 #2
Har midlertidigt lavet følgende funktion, men som nævnt vil jeg helst benytte en fra Frameworket i hvis den findes.

private string stringToXML(string indputtekst)
{
    string tekst = indputtekst;

    tekst.Replace("&", "&amp;");
    tekst.Replace("<","&lt;");
    tekst.Replace(">", "&gt;");
    tekst.Replace("\"","&quot;");
    tekst.Replace("'","&apos;");

    return tekst;
}
Avatar billede peter_svendsen Nybegynder
12. oktober 2006 - 12:17 #3
Er ikke sikker på jeg forstår hvad din kode gør dr_chaos. Jeg har nogle indtastningsfelter der bliver indholdet i nogle xml tags i min kode. I disse felter kan brugeren jo' skrive forskellige forbudte tegn. Disse skal så laves lovlige.

Kan jeg lave hele xml teksten 'lovlig' ved at bruge din kode?
Avatar billede peter_svendsen Nybegynder
12. oktober 2006 - 12:28 #4
Replace virkede ikke helt som jeg havde brugt den, så for god ordens skyld må jeg hellere poste en tilrettet version af min midlertidige løsning.

private string stringToXML(string indputtekst)
{
    string tekst = indputtekst;

    tekst = tekst.Replace("&", "&amp;");
    tekst = tekst.Replace("<","&lt;");
    tekst = tekst.Replace(">", "&gt;");
    tekst = tekst.Replace("\"","&quot;");
    tekst = tekst.Replace("'","&apos;");

    return tekst;
}

Funktionen bruges på følgende måde

System.Text.StringBuilder sb = new System.Text.StringBuilder();
...
sb.Append("<description>" + stringToXML(firmaRow.Adresse + ", " + firmaRow.Postnummer + " " + firmaRow.By) + "</description>\r\n");
sb.Append("<name>" + stringToXML(firmaRow.Navn) + "</name>\r\n");
...
Avatar billede dj_uncas Nybegynder
12. oktober 2006 - 12:43 #5
Du kan evt. få HttpServerUtility til at hjælpe dig:

Den er dog lidt besværlig at få fat på udenfor ASP.NET:

System.Web.HttpApplication app = new System.Web.HttpApplication();
System.Web.HttpServerUtility server = app.Server;

string niceXml = server.HtmlEncode( "<element>Mads & Mikkel</element>" );

niceXml er nu = &lt;element&gt;Mads &amp; Mikkel &lt;/element&gt;
Avatar billede dr_chaos Nybegynder
12. oktober 2006 - 12:44 #6
Jeg troede at du måske modtog et dokument et andet sted fra.
Lige nu har du en string builder som du bruger til at lave xml med.
Generelt er det en dum måde at gøre det på. (Det ved du nok godt siden du spørger :) )
jeg vil foreslå at du laver noget i denne stil:
xmldocument xd = new xmldocument();
XmlDeclaration xmldecl;
//laver en xmldeclaretion som sørge for at encode dokumentet.
xmldecl = xd.CreateXmlDeclaration("1.0", System.Text.Encoding.UTF8.WebName, null);
xd.AppendChild(xmldecl);
/*herefter skal du tilføje dit data til xml dokumentet*/
XmlElement xeFirma = xd.CreateElement("Firma");
xeFirma.AppendChild(xd.CreateElement("description")).InnerText = (firmaRow.Adresse + ", " + firmaRow.Postnummer + " " + firmaRow.By;
xeFirma.AppendChild(xd.CreateElement("name")).InnerText = firmaRow.Navn;
xd.AppendChild(xeFirma);
Avatar billede dr_chaos Nybegynder
12. oktober 2006 - 12:45 #7
du kan se den opbyggede xml ved f.eks. at gemme den
xd.Save("c:\\test.xml");
Avatar billede dr_chaos Nybegynder
12. oktober 2006 - 12:46 #8
På den måde med at opbygge xml dokumentet sikrer du dig at de altid overholder gældende standarder.
Du kan sagtens gennemgå f.eks. en arrayliste og lave den omtil xml hvis du vil.
Avatar billede pumpin Nybegynder
12. oktober 2006 - 18:59 #9
det er måske for voldsomt,men du kunne altid bare smide det i et dataset og bruge dens writeXml metode.
Avatar billede segato Nybegynder
12. oktober 2006 - 22:47 #10
string s = "bær&mås";

            string encoded = System.Web.HttpUtility.UrlEncode(s); // giver dette resultat "b%c3%a6r%26m%c3%a5s"
            string decoded = System.Web.HttpUtility.UrlDecode(encoded); // giver dette resultat "bær&mås"
Avatar billede dr_chaos Nybegynder
13. oktober 2006 - 08:16 #11
segato det har dj_uncas skrevet.
Avatar billede segato Nybegynder
13. oktober 2006 - 10:18 #12
Nej hans metode bygge rpå server objektet, hvor min metode bygger på den statiske klasse. Min er ikke htmlencode men UrlEncode som også er tilgængelig i windows applikationer.
Avatar billede peter_svendsen Nybegynder
13. oktober 2006 - 11:12 #13
Mange tak for de mange forslag. Jeg har desværre møg travlt lige nu, så jeg må vente lidt med at afprøve forslagene.

Jeg skylder nok at forklare hvad jeg bruger det til. Jeg har nogle firmaadresser, som jeg skriver ned i en KML fil, som så loades sammen med Google Earth, så jeg får placeret nogle punkter på kortet.
Avatar billede dj_uncas Nybegynder
13. oktober 2006 - 23:21 #14
segato: HtmlEncode er også tilgængelig i windows apps, om end via en lidt længere vej... Selve metoderne HtmlEncode og HtmlDecode skal ikke bruge noget som helst fra en web server for at fungere...
Avatar billede segato Nybegynder
14. oktober 2006 - 18:32 #15
hej DJ,

Nej jeg er udemærket klar over det ikke kræver en webserver, din metode er helt fin. Jeg kan bare ikke se grunden til at oprette en instans af server objektet, når man kan anvende den statiske klasse UrlEncode.
Avatar billede dj_uncas Nybegynder
15. oktober 2006 - 13:02 #16
Du kan ikke sammenligne de to ting - der er jo forskel på at UrlEncode og HtmlEncode...
Avatar billede segato Nybegynder
15. oktober 2006 - 13:35 #17
Hej DJ,

Nu er jeg ikke ude efter at tage point da jeg ikke samler, jeg angav blot måde jeg ville løse hans problem på. Du må meget gerne få de points. Den løsning jeg har skitseret vil løse hans problem med en linie kode. Jeg bruger selvsamme løsning til mange xml tranformationer.

Hav en god dag.

Thomas
Avatar billede dj_uncas Nybegynder
16. oktober 2006 - 18:48 #18
Jeg er da heller ikke helt vild efter point'ene - det drejer sig jo om at hjælpe ;-)

Og i den forbindelse påpegede jeg bare at selvom UrlEncode og HtmlEncode begge løser problemet, kan de ikke sammenlignes, da de ikke gør det samme...

Jeg tror nogle XML-hajer ville rykke på sig hvis du foreslog dem at UrlEncode i stedet for at HtmlEncode.


Og for at lukke af med manér faldt jeg lige over dette:
string s = System.Web.HttpUtility.HtmlEncode( "bær&mås" ); // s = b&#230;r&amp;m&#229;s
Avatar billede segato Nybegynder
16. oktober 2006 - 23:41 #19
Det jo det, det gør :D Og dine nye løsning vil jeg endda mene er den mest elegante af dem alle, og faktisk lidt en blanding af de to ovenstående. Så moralen må være at komunikation fører til den bedste løsning :D

Mvh.

Thomas
Avatar billede dr_chaos Nybegynder
17. oktober 2006 - 07:39 #20
Jeg vil sige at htmlencode kan bruges.
Men hvis man arbejder en smule mere professionelt med xml, så bør man bruge de indbyggede xml kontroller.

Vi havde en konsulent til at lave noget xml parsing afsendelse af xml.
Han brugte strenge til det og det var engang makværk af den anden verden.

Jeg omskrev hans kode på et par timer og skar den ned fra 2400 linier til 200 linier.

I det som peter svendsen har brug for er hmtlencode som sagt en ok løsning.
Mit løsnings foreslag eller lavet udfra hvad jeg selv ville gøre.

Et problem har mange løsninger :)
Avatar billede segato Nybegynder
17. oktober 2006 - 10:26 #21
Jeg bruger selv for det meste XmlDocument. Der skal man ikke spekulere på encoding da den selv encoder. Og det med folk der altid laver alt i strenge, det skyldes vist de ikke kender de muligheder der findes.
Avatar billede dr_chaos Nybegynder
17. oktober 2006 - 11:04 #22
Jeg er helt enig.
Derfor lavede jeg også mit eksempel med indbyggede kontroller :)

Jeg havde godt lidt svært ved at fatte at en konsulent som skulle være "god" til xml integrationer brugte streng opbygning.
Avatar billede segato Nybegynder
17. oktober 2006 - 11:55 #23
Ja det lyder godt nok lidt som spild af penge.
Avatar billede dr_chaos Nybegynder
17. oktober 2006 - 12:01 #24
det var det i den grad også.
Tvivler på at virksomheden vil hyre andre konsulenter.
Hvis de gør bliver der stillet langt større krav til konsulent og hans måde at løse opgaverne på.
Avatar billede segato Nybegynder
17. oktober 2006 - 12:02 #25
Tror din historie går igen i de fleste firmaer. En eller anden konsulent der vil have tingene til at virke her og nu, men uden omtanke for fremtiden.
Avatar billede dr_chaos Nybegynder
17. oktober 2006 - 12:07 #26
ja og nu var vores konsulent meget lang tid om at lave ingenting og der var lidt for meget pjat.
Han havde 26 forskellige funktioner og jeg kunne omskrive det til en dynamisk funktion som ikke var avanceret.
Avatar billede dj_uncas Nybegynder
17. oktober 2006 - 13:04 #27
Jeg er også meget enig i at man bør bruge .NETs indbyggede XML framework. Faktisk uanset situationen. Man kan dog få brug for HtmlEncode hvis man skal sætte HTML tegn ind i et XML element.
Avatar billede dr_chaos Nybegynder
17. oktober 2006 - 13:11 #28
Det behøver du faktisk ikke.
Det er fordelen ved at bruger de inbyggede kontroller.
Alt encoding sker automatisk.
Et eksempel:
StreamReader sr;
        XmlDocument xd = new XmlDocument();
        xd.Load("http://www.nationalbanken.dk/dndk/valuta.nsf/valuta.xml");
      foreach (XmlNode xn in xd.SelectSingleNode("//exchangerates/dailyrates").ChildNodes)
      {
       
          xn.Attributes["code"].Value="<hej>dgsgsdg</hej>";
       
      }
      System.Diagnostics.Debug.WriteLine(xd.InnerXml);

Prøv at køre eksemplet.
Der kan du se at encoding sker automatisk.
Avatar billede segato Nybegynder
17. oktober 2006 - 14:15 #29
Ja XmlDocument encoder selv. Det dog ikke en kontrol, er sikker på han mener klasser.
Avatar billede peter_svendsen Nybegynder
24. november 2006 - 11:06 #30
Skylder lige en undskyldning.

Den løsning jeg beskrev i starten er grim, men virker, og da jeg har møg travlt med andre ting har jeg desværre ikke fundet tid til at kigge grundigt nok på de forskellige løsninger der er beskrevet i denne tråd.

Jeg håber og satser på at jeg får kigget på det i den nærmeste fremtid...
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