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}&");
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]*""[^""]*)&");
while (regex.IsMatch(projectFileContent))
projectFileContent = regex.Replace(projectFileContent, "${rightPart}${badAttrPre}&");