[VS2003] Progetti non (sempre) validi come XML

I progetti Visual Studio 2003 sono dovrebbero essere dei file XML validi...
Peccato che, se inserite nel progetto un file che contenga un carattere "&", questo non venga codificato correttamente e pertanto non é più un documento XML valido!

<File
    RelPath = "file.txt"
    BuildAction = "None"
/>
<
File
    RelPath = "this&that.txt"
    BuildAction = "None"
/>

Il parser di Visual Studio continua però ad elaborarlo correttamente, il che mi fa pensare che in Microsoft si fossero divertiti a "reinventare la ruota" per l'ennesima volta (ennesimo parser XML?)!
Visual Studio 2005 non soffre di questo problema: non consente file con il carattere "&".

Soluzione? Io mi sono costruito una regulaexpression che sostituisce il carattere "&" all'interno degli attributi (va applicata ricorsivamente se temete che più attributi possano essere affetti oppure un attributo possa essere affetto più di una volta):

//Sostituisco gli & in eccesso
Regex regex = new Regex(@"(?<rightPart>(?<tag><[\w\d]+)(?<rightAttrs>([\s\t\n]+[\w\d]+[\s\t\n]*=[\s\t\n]*""[^&""]*"")*))(?<badAttrPre>[\s\t\n]+[\w\d]+[\s\t\n]*=[\s\t\n]*""(([^&""])|(&(?=\w{2,3};)))*)(?<amp>&)(?!\w{2,3};)");
while (regex.IsMatch(projectFileContent))
    projectFileContent = regex.Replace(projectFileContent, "${rightPart}${badAttrPre}&amp;");

Se poi volete riportare il progetto alla codifica corretta basta, similmente riapplicare questa RegEx:

//RegEx di salvataggio
Regex regex = new Regex(@"(?<rightPart>(?<tag><[\w\d]+)(?<rightAttrs>([\s\t\n]+[\w\d]+[\s\t\n]*=[\s\t\n]*""[^&""]*"")*))(?<badAttrPre>[\s\t\n]+[\w\d]+[\s\t\n]*=[\s\t\n]*""[^""]*)&amp;");
while (regex.IsMatch(projectFileContent))
    projectFileContent = regex.Replace(projectFileContent, "${rightPart}${badAttrPre}&");

Print | posted on venerdì 14 settembre 2007 21:07

Comments have been closed on this topic.