下面我写了代码。我需要帮助才能在 selectName中获得正确的值。我是XPath的新手。基本上这个代码我试图实现如果employeeName = Chris我需要返回23549到调用函数。请帮忙。
部分代码:
public static string getEmployeeeID(string employeeName)
{
Cache cache = HttpContext.Current.Cache;
string cacheNameEmployee = employeeName + "Tech";
if (cache[cacheNameEpm] == null)
{
XPathDocument doc = new XPathDocument(HttpContext.Current.Request.MapPath("inc/xml/" + SiteManager.Site.ToString() + "TechToolTip.xml"));
XPathNavigator navigator = doc.CreateNavigator();
string selectName = "/Technologies/Technology[FieldName='" + fieldName + "']/EpmId";
XPathNodeIterator nodes = navigator.Select(selectName);
if (nodes.Count > 0)
{
if (nodes.Current.Name.Equals("FieldName"))
//nodes.Current.MoveToParent();
//nodes.Current.MoveToParent();
//nodes.Current.MoveToChild("//EpmId");
cache.Add(cacheNameEpm, nodes.Current.Value, null, DateTime.Now + new TimeSpan(4, 0, 0), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}
}
return cache[cacheNameEpm] as string;
}
XML文件
<?xml version="1.0" encoding="utf-8" ?>
<Employees>
<Employee>
<EName>Chris</EName>
<ID>23556</ID>
</Employee>
<Employee>
<EName>CBailey</EName>
<ID>22222</ID>
</Employee>
<Employee>
<EName>Meghan</EName>
<ID>12345</ID>
</Employee>
</Employees>
请注意:此XML文件有100个节点。我只是用1表示结构。
答案 0 :(得分:0)
有几件事:
当前的locig似乎有太多的GotoParent
关于不使用//的声明,我不确定,这取决于XML模式。我不明白为什么要回到父母身边等等。也许如果你详细说明,我们可以理解它......
我的一些困惑是试图重用当前的逻辑。事实上,您只需要一个XPATH导航即可获得所需内容:
"/Employees/Employee[EName="' + employeeName + "']/ID"
上述意思是:从根(单个起始斜杠),查找子元素,然后是具有名为EName 的子项的子项,其值为employeeName 。然后获取此EName节点的ID“sibling”。
然而,我的一些犹豫是双斜线,在XPATH中意味着任何节点完成下一个不必要的路径。如果所有员工记录都不像示例中显示的那样,您可能需要它,并且可能使得获取ID的XPATH部分复杂化。
编辑:最后一件事......(解释为什么你得到所有文件中的值而不仅仅是所选员工姓名的ID)
在使用XPathNodeIterator Current属性之前,您需要调用 nodes.MoveNext()。 简而言之,navigator.Select()调用之后的部分可能是:
if (nodes.Count == 0)
{
return ""; // not found !
}
else
{
nodes.MoveNext(); // <<< That was the missing culprit...
retVal = nodes.Current.Value;
}
答案 1 :(得分:0)
如果您想获得名为“Chris”的员工的“ID”值,您应该可以这样做:
string selectName = "/Employees/Employee[EName='" + employeeName + "']/ID";
XPathNodeIterator idNode = navigator.Select(selectName);
这应该给你XPath:
/Employees/Employee[EName='Chris']/ID
并且应该立即选择该特定节点。它会在ID
集合中为Employee
EName=Chris
提供Employees
元素;这就是你要找的,对吗?
如果您只想选择单个节点并检查其值,请使用以下代码片段:
XPathNavigator empNode = navigator.SelectSingleNode(selectName);
if(empNode != null)
{
string id = empNode.Value;
}
如果您只想要一个节点 - 为什么要使用Select
方法,它会在整个节点列表中返回迭代器?
或者,如果您因某些原因想要坚持原始方法,则需要先阅读.MoveNext()
才能阅读该值:
XPathNodeIterator nodes = navigator.Select(selectName);
if (nodes.Count > 0)
{
if (nodes.MoveNext())
{
string IDvalue = nodes.Current.Value;
}
}
现在,在这种情况下,你的字符串中只有Chris'ID的值。
马克