2013-04-23 2 views
0

У меня есть функция библиотеки, которая выглядит, как показано нижеИспользование XPathNavigator ответа выберите XPathExpression конкатенацией константа

private static string Parse(XPathNavigator xNav, XPathExpression xPathExpression) 
    { 
     string result = string.Empty; 
     XPathNodeIterator xpathIterator = xNav.Select(xPathExpression.Clone()); 

     while (xpathIterator.MoveNext()) 
     { 
      result = result + xpathIterator.Current.TypedValue + "#"; 
     } 

     return result; 
    } 

И есть XML-файл, который будет выглядеть, как показано ниже

<Account account_no ="100"> 
<Name>Hello</Name> 
</Account> 

Теперь мне нужно написать xpath, который возвратит account_no, конкатенирующую некоторую константу

Я написал код примерно как

 XPathDocument doc = new XPathDocument(@"..\..\test.xml", XmlSpace.Default); 
     XPathNavigator xNav = doc.CreateNavigator(); 
     string xpath = "concat('Account No', /Account/@account_no)"; 
     XPathExpression xPathExpression = XPathExpression.Compile(xpath); 
     string result = Parse(xNav, xPathExpression); 

Результат, который я ожидаю, это account_no, префикс которого он содержит некоторую текстовую константу. Поэтому я написал xpath как concat ('Account No',/Account/@ account_no). Но это не сработало, не удалось в xNav.Select(). Пожалуйста, помогите мне, как написать правильный xpath, чтобы получить требуемый результат. У меня нет свободы вносить изменения в функцию синтаксического анализа, что бы я ни делал, я должен делать только с строкой xpath.

спасибо.

ответ

0

Он должен работать, если вы измените метод Parse() быть похожим на это:

private static string Parse(XPathNavigator xNav, XPathExpression xPathExpression) 
{ 
    string result = string.Empty; 
    object selected = xNav.Evaluate(xPathExpression.Clone()); 

    XPathNodeIterator iterator = selected as XPathNodeIterator; 
    if (iterator != null) 
    { 
     result = string.Concat(iterator.OfType<XPathNavigator>() 
             .Select(n => n.TypedValue + "#")); 
    } 
    else 
    { 
     result = selected.ToString(); 
    } 

    return result; 
} 
+0

я не могу вносить изменения в Разобрать() метод. Это часть какой-то другой общей библиотеки. Только я могу играть с выражением xpath ... :( –

+0

В этом случае это невозможно сделать только с выражением XPath, потому что XPathNavigator.Select() работает только с путями выбора узлов. Вы можете это сделать: 'string xPath = "/ Account/@ account_no"; result = "Account No" + Parse (xNav, XPathExpression.Compile (xPath)). TrimEnd ('#'); ' – JLRishe

 Смежные вопросы

  • Нет связанных вопросов^_^