解析一个“复杂”的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批准的: