Изменить значение пространства имен XML xmlns по умолчанию в .NET - PullRequest
0 голосов
/ 03 августа 2011

Мне нужно получить список файлов из файла проекта VS.Файл csproj - это файл XML, поэтому я использую linq to xml для его анализа.Проблема в пространстве имен по умолчанию файла csproj, оно объявлено как:

xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"

Вот код, который я использую, чтобы найти элементы" Compile "вФайл csproj:

XmlReader reader = XmlReader.Create(projectFilePath);
XDocument doc = XDocument.Load(reader);
XmlNameTable nameTable = reader.NameTable;
XmlNamespaceManager nsManager = new XmlNamespaceManager(nameTable);
XNamespace nms = doc.Root.GetDefaultNamespace();
nsManager.AddNamespace("", nms.NamespaceName);
List<XElement> csFiles = new List<XElement>(doc.Root.XPathSelectElements("//Compile", nsManager));

doc.Root.XPathSelectElements возвращает пустой список.

nsManager.DefaultNamespace имеет значение "http://schemas.microsoft.com/developer/msbuild/2003". Но nsManager.LookupNamespace("xmlns") возвращает пространство имен XML по умолчанию:" http://www.w3.org/2000/xmlns/".

Как изменить значение пространства имен xmlns?

1 Ответ

1 голос
/ 03 августа 2011

Ваша проблема в том, что вам нужно четко указать пространство имен в XPath.Он не будет просто использовать документ по умолчанию для документа, вам нужно назвать его.

Если вы измените последние две строки на что-то вроде этого, он будет работать (я выбрал префикс xmlns «default»):

nsManager.AddNamespace("default", nms.NamespaceName);
List<XElement> csFiles = new List<XElement>(doc.Root.XPathSelectElements("//default:Compile", nsManager));

Другой вариант - использовать вместо этого методы XContainer.Таким образом, вам не нужно беспокоиться об использовании менеджера пространства имен:

XNamespace nms = doc.Root.GetDefaultNamespace();
List<XElement> csFiles = new List<XElement>(doc.Root.Descendants(nms + "Compile"));
...