C#和XML可以';t选择好节点';s值
本文关键字:节点 选择 XML 可以 | 更新日期: 2023-09-27 17:59:25
我有一个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);
}
nodeListRes只包含我的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中将包含"blabla1"。这对我来说真的很模糊!
请帮忙!(如果这个问题不够理解,告诉我,英语不是我的母语)
删除//
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
是Resources
的直接子级,请使用单斜杠:
XmlNode nodeTest = nodeRes.SelectSingleNode("./nm:RES_NAME", mgr);
如果没有上面提到的点(.
),引擎将从根节点而不是当前节点进行搜索,然后返回符合条件的第一个节点。