3

次のようなXMLドキュメントがあります

<recipes>
<ingredient value"1">APPLE</ingredient>
<ingredient value"2">BANANA</ingredient>
<ingredient value"3">APPLE ORANGE</ingredient>
<ingredient value"4">APPLE BANANA</ingredient>
<ingredient value"5">APPLE STRAWBERRY</ingredient>
<ingredient value"6">GRAPES</ingredient>
</recipes>

ここで、ユーザーは文字列を入力しますApple Grapes Banana。アルファベット順に並べ替え、文字列操作を使用して最後の単語を再帰的に削除することにより、値の 1 つと一致させようとします。しかし、Linq でこれを行うより効率的な方法があると確信しています。XML で最も近い一致を返すクエリが必要です<ingredient value"4">APPLE BANANA</ingredient>

string str = "APPLE BANANA GRAPES"; // user input arranged by ascending alphabet and capitalized
XDocument xdoc = XDocument.Load(above xml);// gets above xml
var h = xdoc.Root.Elements("ingredient").FirstOrDefault(u => u.Value == str);//recurse these steps
if (h == null)
{
str = str.Remove(str.LastIndexOf(" "));//recurse these steps
}
//check if str matches any value;
//if not remove last word from str and check again;
4

3 に答える 3

1

私は提示する単純な再帰を持っています

    public string FindValueFromText(XDocument xdoc, string str)
    {
        while (str != "")
        {
            var h = xdoc.Root.Elements("ingredient").FirstOrDefault(u => u.Value == str);
            if (h == null)
            {
                str = str.Remove(str.LastIndexOf(" "));
                FindValueFromText(xdoc, str); //recursive
            }
            else 
            {
                return h.Attribute("value").Value;
            }
        }
        return "Not found value";
    }

上記のメソッドを呼び出したい場所にこれらの行を追加します

XDocument xDoc = XDocument.Load(xmlFilePath);
string value = FindValueFromText(xDoc, "APPLE BANANA GRAPES");
于 2013-11-12T15:09:26.410 に答える
1

ここで最も近い一致を得るには、複数の条件が必要になります。

たとえば var h = xdoc.Root.Elements("ingredient").FirstOrDefault(u => str.Contains(u.value)) 、例ではより近い値を返す条件です。

于 2013-11-12T15:03:03.363 に答える