используя xpath, получите правильное значение в selectName - PullRequest
0 голосов
/ 18 сентября 2009

Ниже я написал код. Мне нужна помощь, чтобы получить правильное значение в 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 голосов
/ 19 сентября 2009

Если вы хотите получить значение «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;
   }
}

Теперь, в этом случае, у вас есть только значение идентификатора Криса в вашей строке.

Марк

0 голосов
/ 18 сентября 2009

Несколько вещей:

  • символы косой черты не должны быть удвоены, например, "/ Employee / EName" (если между перечисленными узлами не может быть дополнительных узлов)
  • первый путь должен быть следующим: "/ Employees / Employee [EName = '" + employeeName + "']";
  • второй путь должен быть "ID" (обязательно с учетом регистра)
  • в текущем locig слишком много GotoParent

    по поводу заявления не использовать //, я не уверен, это зависит от схемы XML. Я не понимаю, зачем возвращаться к родителям и т. Д., Может быть, если вы укажете это подробнее, мы сможем разобраться в этом ...

Некоторая моя путаница связана с попыткой повторно использовать текущую логику. По правде говоря, вам понадобится только одна навигационная система XPATH, чтобы получить то, что вам нужно:

"/Employees/Employee[EName="' + employeeName + "']/ID"

Вышеуказанное означает: из корня (одиночная начальная косая черта) найти дочерний элемент, затем его дочерний элемент, имеющий дочерний элемент с именем EName со значением employeeName . Затем получите идентификатор «брат» этого узла EName.

Некоторые мои сомнения, однако, связаны с двойной косой чертой, которая в XPATH означает, что любой узел прошел путь, который не является необходимым, следующий. Если все записи сотрудника не будут соответствовать той, что показана в примере, она может вам понадобиться и, возможно, усложнить часть XPATH, которая получает идентификатор, соответственно.

РЕДАКТИРОВАТЬ: еще одна вещь ... (объясняя, почему вы получаете все значения в файле, а не просто идентификатор для выбранного имени сотрудника)

Вам необходимо вызвать node.MoveNext () , прежде чем использовать свойство XPathNodeIterator Current. Вкратце раздел, следующий за вызовом navigator.Select (), может выглядеть так:

if (nodes.Count == 0)
{
    return ""; // not found !
}
else
{
    nodes.MoveNext();    // <<< That was the missing culprit...
    retVal = nodes.Current.Value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...