Parse Delphi Project File на C # - PullRequest
       16

Parse Delphi Project File на C #

2 голосов
/ 06 декабря 2009

Это может показаться странным вопросом, но у меня есть свои причины для этого! Я пытаюсь проанализировать файл проекта Delphi 2009 (.dproj), который представляет собой XML-представление проекта. Я могу загрузить документ в XmlDocument, но когда я пытаюсь добраться до модулей, используемых в проекте, SelectNodes выдает пустой список.

Пример проекта приведен ниже:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
...
<ItemGroup>
  <DelphiCompile Include="Package.dpk">
    <MainSource>MainSource</MainSource>
  </DelphiCompile>
  <DCCReference Include="vcl.dcp"/>
  <DCCReference Include="Unit1.pas"/>
  <DCCReference Include="Unit2.pas"/>
  <DCCReference Include="Unit3.pas"/>
  <DCCReference Include="Unit4.pas"/>
  <DCCReference Include="Unit5.pas"/>
  ...
</ItemGroup>
</Project>

Пример кода приведен ниже:

  ProjectDocument.Load(FileName);
  XmlNodeList nodeList;
  XmlElement RootNode = ProjectDocument.DocumentElement;

  string xmlns = RootNode.Attributes["xmlns"].Value;

  // This gives an empty list
  nodeList = RootNode.SelectNodes("/Project/ItemGroup/DCCReference");
  foreach (XmlNode title in nodeList)
  {
    Console.WriteLine(title.InnerXml);
  }

  // This also gives an empty list
  nodeList = RootNode.SelectNodes("/ItemGroup/DCCReference");
  foreach (XmlNode title in nodeList)
  {
    Console.WriteLine(title.InnerXml);
  }

Вопрос в том, что я делаю не так, потому что я что-то упускаю. Единственное, что странно, это то, что документ не является .xml, это .dproj.

Итак, заранее спасибо, если вы можете решить эту проблему.

Mark

Ответы [ 3 ]

3 голосов
/ 06 декабря 2009

Цитирование Документация :

Примечания

Если для выражения XPath требуется разрешение пространства имен, необходимо использовать перегрузку SelectNodes , которая принимает XmlNamespaceManager в качестве аргумента. XmlNamespaceManager используется для разрешения пространств имен.

Примечание Если выражение XPath не содержит префикса, предполагается, что URI пространства имен является пустым пространством имен. Если ваш XML включает пространство имен по умолчанию, вы все равно должны использовать XmlNamespaceManager и добавить к нему префикс и URI пространства имен; в противном случае вы не выберете ни одного узла.

Вам нужна версия с двумя аргументами SelectNodes. Также обратите внимание, что у выбранных вами узлов нет содержимого, поэтому свойство InnerXML будет пустым. Как только вы получите непустой список, ваш код все равно будет печатать список пустых строк.

2 голосов
/ 06 декабря 2009

Вам необходимо использовать XmlNamespaceManager :

var nsmgr = new XmlNamespaceManager(ProjectDocument.NameTable);
nsmgr.AddNamespace("x", ProjectDocument.DocumentElement.NamespaceURI);
var nodes = doc.SelectNodes("descendant::x:DCCReference", nsmgr);
0 голосов
/ 07 декабря 2009

Кроме того, почему вы не анализируете файл DPR с помощью своего собственного простого парсера? Найти использование строки, затем берите каждую строку после этого, убирайте комментарии и заключительную запятую, пока не найдете точку с точкой с запятой.

Преимущество # 2, кроме простого разбора, заключается в том, что это работает с КАЖДОЙ версией delphi, тогда как DPROJ и эквивалентные файлы отлично отличаются от версии delphi к версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...