使用xpath在selectName中获取正确的值

时间:2009-09-18 19:27:25

标签: xpath

下面我写了代码。我需要帮助才能在 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表示结构。

2 个答案:

答案 0 :(得分:0)

有几件事:

  • 斜杠字符不需要加倍“/ Employee / EName” (除非列出的节点之间可能有其他节点)
  • 第一条路径应为:“/员工/员工[EName ='”+ employeeName +“']”;
  • 第二条路径应为“ID”(区分大小写,当然)
  • 当前的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的值。

马克