Ich versuche, Elemente aus einem Visual Studio *. Csproj-Datei abzufragen. Ich habe ein kurzes Beispiel, das Problem zu veranschaulichen:Abfrage XDocument mit Xmlns Attribut (Namespace)
// 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);
}
Der String xml1 funktioniert gut, xml2 nichts zurückliefert. Der einzige Unterschied zwischen diesen Zeichenfolgen ist das xmlns-Attribut im Dokumentstammverzeichnis.
Wie kann ich Dokumente abfragen, die xmlns-Attribute enthalten? Warum ist es ein Problem, wenn ein XML-Dokument ein Xmlns-Attribut enthält?
Eine andere Syntax: 'doc.Descendants (" {http://schemas.microsoft.com/developer/msbuild/2003}ItemGroup ")' – ziya
Sorry ich verstehe nicht, warum wir den Namespace explizit schreiben müssen, wenn es ist die DEFAULT für dieses Dokument? Was ist der Grund, dass dies nicht durch XElement/XDocument selbst implizit gelöst wird? –
@FelixKeil: Wenn Sie 'Element' oder' Descendants' aufrufen, geben Sie einen 'XName' an, der vollständig qualifiziert ist ... und der vollständig qualifizierte Name enthält den Namespace. Ich verstehe Ihren Standpunkt, aber ich denke, es macht Sinn, wie es gemacht wird, und die Namespace-Unterstützung in LINQ to XML ist die beste XML-API, die ich je gesehen habe. –