Avatar billede globen Nybegynder
07. juni 2012 - 12:07 Der er 6 kommentarer

Parse ulovlige xml chars

Hej eksperter.

Kort spørgsmål. Findes der ikke en metode i .NET jeg kan bruge til at parse ulovlige xml karakterer, når jeg gerne vil loade et xml dokument med System.Xml.XmlDocument.LoadXml(string xml)?

Jeg har gentagne gange fundet mig selv i gang med at implementere denne logik selv, og jeg er lidt træt af det.

Når jeg læser InnerTexxt/InnerXml på et element i dokumentet der indeholder "B&O", så bliver det implicit parset til "B&O". Det er sådan set den omvendte logik jeg er ude efter.
Avatar billede jakobdo Ekspert
07. juni 2012 - 13:16 #1
Bare en tanke.
Kunne man ikke indlæse xml filen som en streng.
og så lave en replace på ulovlige tegn, måske noget htmlentities eller lign og herefter parse filen?
Avatar billede globen Nybegynder
07. juni 2012 - 13:38 #2
Nu kender jeg ikke til htmlentities, men jeg kunne forestille mig, at man her også parser visse karakterer, som er gyldige i xml, såsom eøå f.eks.

Den approach jeg har anvendt, når jeg har implementeret dette manuelt er:

- Erstat alle ulovlige chars som i forvejen er escaped med en guid
- Escape ulovlig chars
- Erstat ovenstående guids med de orginale værdier

Dette selvfølgelig for at undgå at erstatte & med &.

Jeg syntes det er triviel at implementere dette (det er sikkert hellere ikke særligt performancevenligt, at læse dokumentet igennem tre gange for at parse det), og jeg tænker at denne funktionalitet sikkert findes et eller andet sted i selve .NET frameworket.
Avatar billede jakobdo Ekspert
07. juni 2012 - 13:49 #3
En anden tanke.
Kunne du ikke bare sige til afsender af den xml fil, at den skal være valid?
Avatar billede arne_v Ekspert
08. juni 2012 - 02:31 #4
Forslag til at haandtere &:

using System;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = "B&O & B&O &";
            Console.WriteLine(s);
            string s2 = Regex.Replace(s, "&(?!amp;)", "&");
            Console.WriteLine(s2);
            Console.ReadKey();
        }
    }
}
Avatar billede montago Praktikant
27. december 2012 - 13:19 #5
du kan med Regex semi-parse din XML hvis den ellers er gyldig resten af vejen:

Regex.Replace
(
    @"<?xml><hello src='asd?123'>world & crap, ping & pong</hello></xml>"
    /*/
    //Løsning 1:
    ,@"(>[^<>]+?<)"
    ,(a) => {
        return a.Value.Replace("&","&amp;");
    }
    /*/
    //Løsning 2:
    ,@"(>[^<>]+?)&([^<>]+?<)"
    ,"$1&amp;$2"
    /**/
)

Løsning 2 forudsætter at der kun er ET stk og-tegn som skal erstattes pr xml-tag da den kun erstatter den første.. den er tilgengæld hurtigst..

Løsning 1 parser XML'en med regex og laver en search-replace på alle strenge mellem tags som indeholder og-tegn - den er en smule langsommere og kan blive tung hvis XML'en er KÆMPESTOR... men sikkert ikke noget du mærker.

brug '*' til at skifte imellem de to løsninger.
Avatar billede montago Praktikant
27. december 2012 - 13:21 #6
hov.. regex i (1) skulle være se magen til ud som i (2):

,@"(>[^<>]+?)&([^<>]+?<)"
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
Kurser inden for grundlæggende programmering

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