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

C# C和XML无法选择好节点的值,c#,xml,C#,Xml,我有一个XML文件,其中包含几个人的数据。这个文件是通过web服务填充的,但我认为这并不重要。在程序的某个时候,我需要遍历文件中的所有人 XmlNamespaceManager mgr = new XmlNamespaceManager(res.NameTable); mgr.AddNamespace("nm", res.DocumentElement.NamespaceURI); XmlNodeList nodeListRes = res.SelectNodes("//nm:Resources

我有一个XML文件,其中包含几个人的数据。这个文件是通过web服务填充的,但我认为这并不重要。在程序的某个时候,我需要遍历文件中的所有人

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);

}
nodelister只包含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将包含通过调试器验证的数据blabla2,但nodeTest将包含bla1。这对我来说真的很难懂

请帮忙!如果这个问题不太容易理解,告诉我,英语不是我的母语//

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

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

//表示xml文档中的任意位置

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

XmlNode nodeTest = nodeRes.SelectSingleNode(".//nm:RES_NAME", mgr);
或者更好,因为RES_NAME是资源的直接子级,所以使用单斜杠:

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

没有重点。如上所述,引擎将从根节点而不是当前节点进行搜索,然后返回第一个符合条件的节点。

我认为您应该使用XNODE类,它更易于处理。嗯,是的,我可以,但我需要大量重构。我想今天下午我会试试,但我一直在寻找答案。的确,它很有效。这就是为什么我讨厌xml,它对我来说太精确了!但它很管用,谢谢。我只是有一个问题:nodeTest应该在nodeRes中选择一个节点,nodeRes只包含一个我验证过的资源,那么为什么地狱nodeTest会选择一个甚至不在nodeRes中的节点呢?我想这对我来说太复杂了