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?
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.
En anden tanke.
Kunne du ikke bare sige til afsender af den xml fil, at den skal være valid?
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();
}
}
}
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("&","&");
}
/*/
//Løsning 2:
,@"(>[^<>]+?)&([^<>]+?<)"
,"$1&$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.
hov.. regex i (1) skulle være se magen til ud som i (2):
,@"(>[^<>]+?)&([^<>]+?<)"