2012-01-27 115 views
0

我正在研究一些代碼來讀取和解析XML文件的節點,並且文件的佈局很複雜(​​至少,對我來說似乎是這樣 - 沒有完成和XML解析,直到這個項目)。解析一個「複雜」的XML文件

爲XML文件的格式與此類似:

<Parameters> 
    <General> 
    <Name>Name of this parameter</Name> 
    <Caption>Information about the parameter</Caption> 
    <GroupName>A Small Group of parameters</GroupName> 
    <Value>1</Value> 
    <Type>Boolean</Type> 
    <Description>Some description</Description> 
    <Dependencies> 
     <And> 
     <GroupName>Some other group of parameters</GroupName> 
     <Name>The parameter this one is dependent on</Name> 
     </And> 
     <Or> 
     <GroupName>Some other group of parameters</GroupName> 
     <Name>The parameter this one might be dependent on</Name> 
     </Or> 
    </Dependencies> 
    </General> 
</Parameters> 

我解析這樣的文件:

XmlDocument xDoc = new XmlDocument(); 
Assembly _assembly = Assembly.GetExecutingAssembly(); 
Stream s = _assembly.GetManifestResourceStream(@"NameOfAssembly.NameOfFile.xml"); 
xDoc.Load(s); 
xmlTests = xDoc.SelectNodes("/Parameters/General"); 
foreach (XmlNode rootType in xmlTests) 
{ 
    switch (rootType.Name.ToString()) 
    { 
     case "General": 
      name = rootType["Name"].InnerText; 
      caption = rootType["Caption"].InnerText; 
      groupName = rootType["GroupName"].InnerText; 
      mandatory = rootType["Mandatory"].InnerText; 
      value = Convert.ToInt32(rootType["Value"].InnerText); 
      typeOfData = rootType["Type"].InnerText; 
      description = rootType["Description"].InnerText; 
      //groupDepAnd = rootType["Dependencies/And/GroupName"].InnerText; 
      //XmlNodeList dependenciesList = rootType.SelectNodes("Parameters/General/Dependencies/And"); 
      //foreach (XmlNode dependenciesAndNode in dependenciesList) 
      //{ 
       //groupDepAnd = dependenciesAndNode["GroupName"].InnerText; 
       //namesDepAnd = dependenciesAndNode["Names"].InnerText; 
      //} 
      //dependenciesList = rootType.SelectNodes("Parameters/General/Dependencies/Or"); 
      //foreach (XmlNode dependenciesOrNode in dependenciesList) 
      //{ 
       //groupDepOr = dependenciesOrNode["GroupName"].InnerText; 
       //namesDepOr = dependenciesOrNode["Names"].InnerText; 
      //} 
      /* send values to object constructor */ 
      break; 
     default: 
      break; 
    } 
} 
/*close Stream, xDoc and such */ 

當我分析我的問題出現(或試圖根據具體情況來解析)依賴關係節點。我不完全確定如何解析它們中的每一個(來自And的GroupName和Name,然後將來自Or的GroupName和Name)解析爲字符串。我已經評論過似乎不工作的線路,我希望他們如何。

我已經註釋掉了的foreach循環,顯然通讀了通用節點列表中的所有依賴關係。並且啓動「groupDepAnd =」(第18行)的行無法給我一個空引用異常。

我試圖正確解析這個XML文件嗎?我究竟做錯了什麼?任何和所有的幫助將不勝感激。正如我前面所說,我對XML的使用非常有限。

回答

1

您遇到的問題可能會通過這些修補程序來解決:

//this selects the value of just the first 'And' node, SelectSingleNode lets you use XPath 
groupDepAnd = rootType.SelectSingleNode("Dependencies/And/GroupName").InnerText; 

//You were using the wrong XPath to get the collection, rootType is already at /Parameters/General 
XmlNodeList dependenciesList = rootType.SelectNodes("Dependencies/And"); 

希望幫助,這也是值得注意的是,在循環中,您將需要做的事情,如果有多個和或或者節點,此刻你只是覆蓋舊的值。

我要補充的另一件事是,你也可以使用新的XDocument而不是XmlDocument。有些人更喜歡它,因爲它更像Linq式的。它甚至是John Skeet批准的:

XDocument or XmlDocument