Tôi cố gắng truy vấn các phần tử từ một tệp hình ảnh * .csproj. Tôi đã tạo một ví dụ ngắn để minh họa sự cố:Truy vấn XDocument với thuộc tính xmlns (không gian tên)
// 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);
}
Chuỗi xml1 hoạt động tốt, xml2 không trả lại bất kỳ thứ gì. Sự khác biệt duy nhất giữa các chuỗi là thuộc tính xmlns trong gốc tài liệu.
Làm cách nào để truy vấn các tài liệu chứa thuộc tính xmlns? Tại sao lại là vấn đề khi tài liệu xml chứa thuộc tính xmlns?
Một cú pháp khác: 'doc.Descendants (" {http://schemas.microsoft.com/developer/msbuild/2003}ItemGroup ")' – ziya
Xin lỗi tôi không hiểu tại sao chúng ta phải viết rõ ràng vùng tên nếu nó DEFAULT cho tài liệu này là gì? Lý do mà điều này không được giải quyết bởi XElement/XDocument chính nó tiềm ẩn là gì? –
@FelixKeil: Bởi vì khi bạn gọi 'Element' hoặc' Descendants', bạn chỉ định 'XName', đủ điều kiện ... và tên đủ điều kiện bao gồm không gian tên. Tôi thấy quan điểm của bạn, nhưng tôi nghĩ rằng nó có ý nghĩa theo cách nó được thực hiện, và sự hỗ trợ không gian tên trong LINQ to XML là tốt nhất của bất kỳ API XML tôi đã nhìn thấy. –