2009-12-06 29 views
2

這可能看起來像一個奇怪的問題,但我有我自己的理由!我試圖解析一個Delphi 2009項目文件(.dproj),它是項目的XML表示。我可以將文檔加載到XmlDocument中,但是當我嘗試訪問項目中使用的單元時,SelectNodes會給我一個空列表。在C上解析Delphi項目文件#

項目的下面是一個例子:

<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。

所以,如果你能解決這個問題,請提前致謝。

馬克

回答

3

報價the documentation

備註

如果XPath表達式需要命名空間解析,您必須使用的SelectNodes超載這需要一個XmlNamespaceManager作爲其參數。 XmlNamespaceManager用於解析名稱空間。

注意如果XPath表達式不包含前綴,則假定命名空間URI是空的命名空間。如果您的XML包含默認名稱空間,則仍然必須使用XmlNamespaceManager併爲其添加前綴和名稱空間URI;否則,你不會選擇任何節點。

您需要two-argument version of SelectNodes。另外請注意,您選擇的節點沒有內容,因此InnerXML屬性將爲空。一旦你得到一個非空列表,你的代碼仍然會打印一個空行列表。

+0

好極了,這兩個答案的組合完成了。 謝謝 – Mmarquee 2009-12-06 18:21:03

2

您需要使用XmlNamespaceManager

var nsmgr = new XmlNamespaceManager(ProjectDocument.NameTable); 
nsmgr.AddNamespace("x", ProjectDocument.DocumentElement.NamespaceURI); 
var nodes = doc.SelectNodes("descendant::x:DCCReference", nsmgr); 
+0

好極了,這兩個答案的組合都做到了。 謝謝 – Mmarquee 2009-12-06 18:20:32

0

而且,你爲什麼不解析用自己簡單的解析器的DPR文件?找到用法 一行,然後抓取每一行,剝離註釋和最終的逗號,直到用分號打出一行。

除了更簡單的解析之外,優點#2可用於每個delphi版本,而DPROJ和等價文件與delphi版本有所不同。