1

XML がどのように機能するかを学ぼうとして、XML を少しいじってみたところ、奇妙な問題に遭遇しました。XML ファイルに対してクエリを実行すると、存在することがわかっている結果が得られないことがあります。実際、結果が得られるのは最初のエントリだけです。以下は、XML エントリの例と、ユーザーが存在するかどうかを確認するための小さな関数です。

<users>
  <user>
    <username>a</username>
    <firstname>a</firstname>
    <lastname>a</lastname>
  </user>
  <user>
    <username>b</username>
    <firstname>b</firstname>
    <lastname>b</lastname>
  </user>
  <user>
    <username>rawr</username>
    <firstname>a</firstname>
    <lastname>a</lastname>
  </user>
</users>

>

private bool FindUser(string username)
{
        XDocument doc = XDocument.Load(filePath);


        var data = from item in doc.Descendants("users")
                   where item.Element("user").Element("username").Value == username.ToLower()
                   select new
                   {
                       usernameEle = item.Element("user").Element("username").Value
                   };

        var p = data.FirstOrDefault();
        if (p != null)
            return true;
        else
            return false;
}

ユーザー「a」を検索しようとすると、true が返されます。他のユーザー名を検索すると、false が返されます。

簡単な解決策があると確信していますが、それは私を避けています! どんな助けでも素晴らしいでしょう。

4

2 に答える 2

2

クエリは最初のuser要素を見ているだけです。すべてのユーザーを表示するように変更します。それを行う簡単な方法は、すべての「ユーザー」要素を取得してから、答えがあるときにユーザー名の値をテストすることです。

より短い実装は次のようになります。

bool IsUserPresent(string username)
{
    username = username.ToLower();
    var doc = XDocument.Load(filePath);
    return doc
      .Descendants("user")
      .Any(u => u.Element("username").Value == username));
}
于 2013-01-23T04:46:01.517 に答える
0

私は答えを見つけました...しかし、なぜこれがうまくいったのかわかりません。私はまだXMLに少し慣れていません...

「item.Element("user").Element("username").Value」を「item.Element("username").Value」に変更しました。また、「from item in doc.Descendants("users")」を「from item in doc.Descendants("user")」に変更

var data = from item in doc.Descendants("users")
           where item.Element("user").Element("username").Value == username.ToLower()
           select new
           {
               usernameEle = item.Element("user").Element("username").Value
           };

var data = from item in doc.Descendants("user")
           where item.Element("username").Value == username.ToLower()
           select new
           {
               usernameEle = item.Element("username").Value
           };

最初のエントリ以上のものを取得できるようになりました。b または rawr を検索すると、適切な結果が得られます。

奇数。

于 2013-01-23T04:33:37.803 に答える