首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#和XML不能选择好节点的值

C#和XML不能选择好节点的值
EN

Stack Overflow用户
提问于 2014-04-23 09:49:22
回答 2查看 78关注 0票数 0

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

代码语言:javascript
复制
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只包含我的xml文件的资源(又名人员)。我想遍历所有这些人并获得特定的信息(在这个例子中,名字)。nodeRes确实有效(它在for循环的每一次迭代中都会发生变化),但是(这是我无法理解的),nodeTest总是与xml文件的第一个资源相关的!

例如,下面是文件(带有虚拟数据)

代码语言:javascript
复制
<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将包含"blabla1”。对我来说真的很模糊!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-23 09:59:17

删除//

代码语言:javascript
复制
XmlNode nodeTest = nodeRes.SelectSingleNode("//nm:RES_NAME",mgr);

应该是

代码语言:javascript
复制
XmlNode nodeTest = nodeRes.SelectSingleNode("nm:RES_NAME",mgr);

//表示“xml文档中的任何位置”

票数 1
EN

Stack Overflow用户

发布于 2014-04-23 10:11:10

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

代码语言:javascript
复制
XmlNode nodeTest = nodeRes.SelectSingleNode(".//nm:RES_NAME", mgr);

或者更好的是,由于RES_NAMEResources的直接子级,所以使用单个斜杠:

代码语言:javascript
复制
XmlNode nodeTest = nodeRes.SelectSingleNode("./nm:RES_NAME", mgr);

在没有上述点(.)的情况下,引擎将从根节点而不是当前节点进行搜索,然后返回满足条件的第一个节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23240709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档