Abfrage XDocument mit dem Attribut xmlns (Namensraum)
Ich versuche query-Elemente aus einer visual studio *.csproj-Datei. Ich erstellte ein kurzes Beispiel um das problem zu veranschaulichen:
//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);
}
Den string xml1 funktioniert, xml2 nichts zurückgibt. Der einzige Unterschied zwischen diesen Saiten ist das xmlns-Attribut im Dokument-root.
Wie kann ich die Abfrage von Dokumenten mit xmlns-Attribute?
Warum ist es ein problem, wenn ein xml-Dokument enthält ein xmlns-Attribut?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht, wenn Sie verstehen, was es bedeutet 🙂 im Grunde, die Sie angewendet haben Standard namespace-URI "http://schemas.microsoft.com/developer/msbuild/2003" für alle Elemente. Also, wenn Sie Abfragen haben, müssen Sie angeben, dass der namespace auch. Zum Glück, LINQ to XML macht, die wirklich einfach:
doc.Descendants("{http://schemas.microsoft.com/developer/msbuild/2003}ItemGroup")
Element
oderDescendants
du bist der Angabe einerXName
, die voll-qualifizierten... und der voll-qualifizierte name beinhaltet den namespace. Ich sehen Ihren Punkt, aber ich denke, es macht Sinn die Art und Weise es gemacht wird, und die namespace-Unterstützung für LINQ to XML ist die schönste von beliebigen XML-API, die ich gesehen habe.Es ist nicht notwendig zu wissen, die namespace vorher.
Sie können code schreiben, das funktioniert mit beiden Xmls, da können Sie den Standard-namespace von XElement.
Schrieb ich auch eine extension-Methode zu lösen, die XName von jedem XObject (XElement, XDocument, etc.).
Der Vorteil bei der Verwendung der extension-Methode anstelle von GetDefaultNamespace ist, dass Sie nicht haben, um zu überprüfen, ob es bereits einen anderen Namensraum zur Verfügung gestellt.
Können Sie es verwenden, wie dies
Ich denke, LINQ to XML ist eine wunderbare API. Aber ich denke, es ist klar, dass, wenn ich nicht einen Namensraum angeben, dass ich immer meine die Standard-namespace. Ich sehe keinen Grund, warum LINQ to XML nicht auf diese Weise Verhalten. Das ist ein kleiner Nachteil, der mich wirklich geärgert. Und die erste Zeit als Anfänger mit LINQ to XML wusste ich nicht, was ich falsch gemacht habe für die Stunden, wenn ich vergessen haben, ist der Standard-namespace.