0

以下のようなライブラリ関数があります

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> 

ここで、いくつかの定数を連結した account_no を返す xpath を作成する必要があります。

以下のようなコードを書きました

        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 を記述する方法を教えてください。解析関数を変更する自由はありません。できることは何でも、x​​path文字列のみで行う必要があります。

ありがとうございました。

4

1 に答える 1

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;
}
于 2013-04-23T12:49:17.493 に答える