Provo a interrogare gli elementi da un file * .csproj di Visual Studio. Ho creato un breve esempio per illustrare il problema:Query XDocument con attributo xmlns (spazio dei nomi)
// Working
string xml1 = @"<Project ToolsVersion='4.0'>
<ItemGroup Label='Usings'>
<Reference Include='System' />
<Reference Include='System.Xml' />
</ItemGroup>
</Project>";
// Not working
string xml2 = @"<Project ToolsVersion='4.0' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
<ItemGroup Label='Usings'>
<Reference Include='System' />
<Reference Include='System.Xml' />
</ItemGroup>
</Project>";
XDocument doc = XDocument.Parse(xml2);
foreach (XElement element in doc.Descendants("ItemGroup"))
{
Console.WriteLine(element);
}
Il xml1 stringa funziona bene, xml2 non restituisce nulla. L'unica differenza tra queste stringhe è l'attributo xmlns nella root del documento.
Come faccio a interrogare documenti contenenti attributi xmlns? Perché è un problema quando un documento xml contiene un attributo xmlns?
Un'altra sintassi: 'doc.Descendants (" {http://schemas.microsoft.com/developer/msbuild/2003}ItemGroup ")' – ziya
Spiacente, non capisco perché dobbiamo scrivere esplicitamente lo spazio dei nomi se è il DEFAULT per questo documento? Qual è la ragione per cui questo non è stato risolto implicitamente da XElement/XDocument? –
@FelixKeil: Perché quando chiami 'Elemento' o' Discendenti' stai specificando un 'XName', che è pienamente qualificato ... e il nome completo include lo spazio dei nomi. Vedo il tuo punto di vista, ma penso che abbia senso nel modo in cui è stato fatto, e il supporto per lo spazio dei nomi in LINQ to XML è la più bella tra tutte le API XML che ho visto. –