Используя 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.

Спасибо.


person Krishnaraj Barvathaya    schedule 23.04.2013    source источник


Ответы (1)


Это должно работать, если вы измените свой метод 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;
}
person JLRishe    schedule 23.04.2013
comment
Я не могу внести изменения в метод Parse(). Это часть какой-то другой универсальной библиотеки. Только я могу играть с выражением xpath... :( - person Krishnaraj Barvathaya; 23.04.2013
comment
В этом случае невозможно выполнить это с помощью только выражения XPath, поскольку XPathNavigator.Select() работает только с путями выбора набора узлов. Вы могли бы сделать это: string xPath = "/Account/@account_no"; result = "Account No" + Parse(xNav, XPathExpression.Compile(xPath)).TrimEnd('#'); - person JLRishe; 23.04.2013