1

わかりました、リンク クエリでユーザーのリストを返したいと思います。以下はXMLです

<section type="Users">
    <User type="WorkerProcessUser">
        <default property="UserName" value="Main"/>
        <default property="Password" value=""/>
        <default property="Description" value=""/>
        <default property="Group" value=""/>
    </User>
    <User type="AnonymousUser">
        <default property="UserName" value="Second"/>
        <default property="Password" value=""/>
        <default property="Description" value=""/>
        <default property="Group" value=""/>
    </User>
</section>

そして、動作しない私の現在のLINQクエリ。doc は XDocument です

var users = (from iis in doc.Descendants("section")
                     where iis.Attribute("type").Value == "Users"
                     from user in iis.Elements("User")
                     from prop in user.Descendants("default")
                     select new 
                     {
                         Type = user.Attribute("type").Value, 
                         UserName = prop.Attribute("UserName").Value
                     });

Object reference not set to an instance of an object例外があります。誰が私が何を修正する必要があるか教えてもらえますか?

これは、間違ったプロパティ名を修正した後の2回目の試みです。ただし、これを使用しようとしたとき、または少なくともコンソールに書き込もうとしたときに、これは UserName 値を列挙していないようです。また、これは合計 8 つの結果を返します。ユーザーが 2 人しかいないため、結果は 2 つしかないはずです。

(from iis in doc.Descendants("section")
                     where iis.Attribute("type").Value == "Users"
                     from user in iis.Elements("User")
                     from prop in user.Descendants("default")
                     select new
                     {
                         Type = user.Attribute("type").Value,
                         UserName = (from name in prop.Attributes("property")
                                     where name.Value == "UserName"
                                     select name.NextAttribute.Value).ToString()
                     });
4

3 に答える 3

1

私はこのようなことをします:

doc.XPathSelectElement("section[@type='Users']")
.Elements("User")
.Select(c => new
{
    Type = c.Attribute("type").Value,
    UserName = c.XPathSelectElement("default[@property='UserName']").Attribute("value").Value
});

拡張メソッドを見つけるにusing System.Xml.XPath;は、.cs ファイルの先頭に追加する必要があります。XPathSelectElement

于 2012-06-15T19:35:37.290 に答える
0
var root = XDocument.Load(@"...").Root;
var ns = root.GetDefaultNamespace();
var users = root.Descendants(ns.GetName("default")).Where(e => e.Attribute("property").Value == "UserName").Select(e => new
{
    Type = e.Parent.Attribute("type").Value,
    UserName = e.Attribute("value").Value
});
Console.WriteLine(String.Join(Environment.NewLine, users.Select(u => String.Format("{0} ({1})", u.UserName, u.Type))));
于 2012-06-15T22:02:03.017 に答える
0

要素には属性がありませdefaultん。属性の値です。usernameusernameproperty

そして、これが、書かれたものに代わるものとして、おそらくあなたのクエリがどのように見えるべきかHenk Holtermanです。違いは、要素レベルではなく要素レベルで選択することです。Userdefault[@property='UserName']

var usr = (from iis in doc.Descendants("section")
           where iis.Attribute("type").Value == "Users"
           from user in iis.Elements("User")
           select new
           {
               Type = user.Attribute("type").Value,
               UserName = (from prop in user.Descendants("default")
                           where prop.Attribute("property").Value == "UserName"
                           select prop.Attribute("value").Value).FirstOrDefault()
           });

2 回目の試行と比較して、コードfrom prop in user.Descendants("default")は匿名型コンストラクターに移動され、UserName への割り当てが簡素化されました。

于 2012-06-15T19:39:52.517 に答える