解析一个“复杂”的XML文件

问题描述:

我正在研究一些代码来读取和解析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的使用非常有限。

您遇到的问题可能会通过这些修补程序来解决:

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