C#和XML无法选择好节点的值

时间:2014-04-23 09:49:22

标签: c# xml

我有一个XML文件,其中包含多个人的数据(此文件通过网络服务填充,但我认为它并不重要)。在程序的某个时刻,我需要遍历文件中的所有人。

XmlNamespaceManager mgr = new XmlNamespaceManager(res.NameTable);
mgr.AddNamespace("nm", res.DocumentElement.NamespaceURI);
XmlNodeList nodeListRes = res.SelectNodes("//nm:Resources", mgr);
for (int i = 0; i <= nodeListRes.Count-1; i++)
{

    XmlNode nodeRes = nodeListRes.Item(i);
    XmlNode nodeTest = nodeRes.SelectSingleNode("//nm:RES_NAME",mgr);

}

nodeListRes 仅包含my xml文件的资源(也就是人员)。我想迭代所有这些人并获得特定信息(在这个例子中,名称)。 nodeRes 确实有效(它随着for循环的每次迭代而变化)但是(而且它是我能理解的) nodeTest 总是与我的xml文件的第一个资源有关!

这里是文件(例如虚拟数据)

<ResourceDataSet xmlns="namespace">
  <Resources>
    <RES_UID>blabla1</RES_UID>
    <RES_NAME>blabla1</RES_NAME>
    <RES_PHONETICS>blabla1</RES_PHONETICS>
    <WRES_EMAIL>blabla1</WRES_EMAIL>
    <RES_CODE>blabla1</RES_CODE>
    <RES_GROUP>blabla1</RES_GROUP>
    <RES_HIRE_DATE>blabla1</RES_HIRE_DATE>
    <RES_COST_CENTER>blabla1</RES_COST_CENTER>
    <BaseCalendarUniqueId>blabla1</BaseCalendarUniqueId>
  </Resources>
  <Resources>
    <RES_UID>blabla2</RES_UID>
    <RES_NAME>blabla2</RES_NAME>
    <RES_PHONETICS>blabla2</RES_PHONETICS>
    <WRES_EMAIL>blabla2</WRES_EMAIL>
    <RES_CODE>blabla2</RES_CODE>
    <RES_GROUP>blabla2</RES_GROUP>
    <RES_HIRE_DATE>blabla2</RES_HIRE_DATE>
    <RES_COST_CENTER>blabla2</RES_COST_CENTER>
    <BaseCalendarUniqueId>blabla2</BaseCalendarUniqueId>
  </Resources>
</ResourceDataSet>

并且,在我的代码中,在for循环的第二次迭代中, nodeRes 将包含数据&#34; blabla2&#34; (使用调试器验证)但 nodeTest 将包含&#34; blabla1&#34;。它对我来说真的很模糊!

请帮忙! (如果问题不易理解,请告诉我,英语不是我的母语)

2 个答案:

答案 0 :(得分:1)

放弃//

XmlNode nodeTest = nodeRes.SelectSingleNode("//nm:RES_NAME",mgr);

应该是

XmlNode nodeTest = nodeRes.SelectSingleNode("nm:RES_NAME",mgr);

//代表&#34; xml文档中的任何地方&#34;

答案 1 :(得分:0)

其他可能的方法是在XPath查询的开头添加单点(.),以指示查询是相对于当前节点的:

XmlNode nodeTest = nodeRes.SelectSingleNode(".//nm:RES_NAME", mgr);

或者更好,因为RES_NAMEResources的直接子项,使用单斜杠:

XmlNode nodeTest = nodeRes.SelectSingleNode("./nm:RES_NAME", mgr);

如果没有上面提到的点(.),引擎将从根节点而不是当前节点进行搜索,然后返回第一个节点符合条件。