2

xml ステートメントでメッセージにサブカテゴリを追加しようとしています。これを行う方法はありますかGroupMessages -> Message -> GroupMessage:

        var groups = xDoc.Descendants("Group")
            .Select(n => new
            {
                GroupName = n.Element("GroupName").Value,
                GroupHeader = n.Element("GroupHeader").Value,
                TimeCreated = DateTime.Parse(n.Element("TimeAdded").Value),
                Tags = n.Element("Tags").Value, 
                Messages = n.Element("GroupMessages").Value
                //line above
            })
            .ToList();
        dataGrid2.ItemsSource = groups;

私のメソッド GroupMessages には MessageID と GroupMessage の両方が含まれており、1 つのコンテナー内のデータグリッドに両方がリストされています。だから私はこれを試しましたが、何もリストされていません:

 Messages = n.Descendants("GroupMessages").Select(nd => nd.Element("GroupMessage").Value)

私のXMLは次のようになります。

<Group>
<TimeAdded>2012-04-27T10:23:50.7153613+01:00</TimeAdded>
<GroupName>Group</GroupName>
<GroupHeader>Header</GroupHeader>
<GroupMessages>
<Message>
<MessageID>1</MessageID>
<GroupMessage>Message</GroupMessage>
<MessageGroup/>
</Message>
</GroupMessages>
</Group>

私も試しました:

Messages = n.Descendants("GroupMessages").Select(nd => nd.Descendants("Message").Select(nde => nde.Element("GroupMessage").Value))

無駄に?

アップデート:

    private void ListGroups_Click(object sender, RoutedEventArgs e)
    {
        string uriGroup = "http://localhost:8000/Service/Group";
        XDocument xDoc = XDocument.Load(uriGroup);
        var groups = xDoc.Descendants("Group")
                    .Select(n => new
        {
            GroupName = n.Element("GroupName").Value,
            GroupHeader = n.Element("GroupHeader").Value,
            TimeCreated = n.Element("TimeAdded").Value,
            Tags = n.Element("Tags").Value,
            Messages = n.Element("GroupMessages").Descendants("Message").Select(nd => new
            {
                //Id = nd.Element("MessageID").Value,
                Message = nd.Element("GroupMessage").Value
            }).FirstOrDefault()
        })
        .ToList();
        dataGrid2.ItemsSource = groups;
    }

残念ながら、このメソッドはデータグリッドのセル内に「コレクション」を表示します。ToArray を試すと、セル内に配列メッセージが表示されます。GroupMessage を実際に表示する方法はありますか? データグリッドの子要素の設定方法がわからない?

4

2 に答える 2

1

これを試して:

var groups = xDoc.Elements("Group")
            .Select(n => new
            {
                GroupName = n.Get("GroupName", string.Empty),
                GroupHeader = n.Get("GroupHeader", string.Empty),
                TimeCreated = n.Get("TimeAdded", DateTime.MinValue),
                Tags = n.Get("Tags", string.Empty),
                Messages = n.GetEnumerable("GroupMessages/Message", m => new
                {
                    Id = m.Get("MessageID", 0),
                    Message = m.Get("GroupMessage", string.Empty),
                    Group = m.Get("MessageGroup", string.Empty)
                }).ToArray()
            })
            .ToList();

ここから拡張メソッドを使用しました:http ://searisen.com/xmllib/extensions.wiki

TagsGetは、xmlに存在しないノードや空のタグなどのnullケースを処理しますMessageGroup。必要なElements()ノードが参照しているノードの子であり、その名前の子孫ではない場合に使用する必要があります。

xmlをルートノードにコピーしてテストしました。このxmlで動作します:

<root>
  <Group>
    <TimeAdded>2012-04-27T10:23:50.7153613+01:00</TimeAdded>
    <GroupName>Group</GroupName>
    <GroupHeader>Header</GroupHeader>
    <GroupMessages>
      <Message>
        <MessageID>1</MessageID>
        <GroupMessage>Message</GroupMessage>
        <MessageGroup/>
      </Message>
    </GroupMessages>
  </Group>
  <Group>
    <TimeAdded>2012-04-27T10:23:50.7153613+01:00</TimeAdded>
    <GroupName>Group</GroupName>
    <GroupHeader>Header</GroupHeader>
    <GroupMessages>
      <Message>
        <MessageID>1</MessageID>
        <GroupMessage>Message</GroupMessage>
        <MessageGroup/>
      </Message>
    </GroupMessages>
  </Group>
</root>
于 2012-04-29T00:50:23.987 に答える
1

最も基本的なレベルでは、これを実行して単一のメッセージ (最初のメッセージ)を取得できます。

var groups = from grp in xDoc.Descendants("Group")
             select new { 
                GroupName = grp.Element("GroupName").Value,
                GroupHeader = grp.Element("GroupHeader").Value,
                TimeCreated = DateTime.Parse(grp.Element("TimeAdded").Value),
                Message = grp.Element("GroupMessages").Element("Message").Element("GroupMessage").Value
             };

Messagesただし、 ID とメッセージの両方を含むメッセージのリストになりたいとします。その場合、次のことを考慮してください。

var groups = from grp in xDoc.Descendants("Group")
             select new { 
                GroupName = grp.Element("GroupName").Value,
                GroupHeader = grp.Element("GroupHeader").Value,
                TimeCreated = DateTime.Parse(grp.Element("TimeAdded").Value),
                Messages = grp.Element("GroupMessages")
                             .Descendants("Message")
                             .Select(msg => new { 
                                 Id = msg.Element("MessageID").Value, 
                                 Message = msg.Element("GroupMessage").Value
                             }).ToList()
             };

ただし、匿名クラスをこのように使用すると、混乱が生じるだけであることを強く強調します。のクラスがある場合は、それらGroupMessage使用します。

あなたが抱えている問題は、XML 構造を無視してランダムな要素を選択していることに注意してください。単一の要素から値を取得するには、その要素を正確に選択して、.Value. 親を選択するか、親の親を選択するだけでは不十分です。

于 2012-04-28T23:54:40.553 に答える