【问题标题】:Parsing a "complex" XML file解析“复杂”的 XML 文件
【发布时间】:2012-01-27 15:38:14
【问题描述】:

我正在编写一些代码来读取和解析 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 方面的经验非常有限。

【问题讨论】:

    标签: xml c#-4.0


    【解决方案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");
    

    希望有所帮助,同样值得注意的是,在循环中,如果有多个 And 或 Or 节点,您将需要做一些事情,此时您只是覆盖旧值。

    我要补充的另一件事是,您还可以使用较新的XDocument 代替XmlDocument。有些人更喜欢它,因为它更像 Linq-esque。它甚至得到了 John Skeet 的认可:

    XDocument or XmlDocument

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多