c# - xdoc 查询的 Select 语句

标签 c# xml linq web-services rest

我正在尝试在 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,并且它在一个容器内的数据网格中列出这两者。所以我尝试了这个,但它什么也没列出:

 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?不确定如何设置数据网格的子元素?

最佳答案

在最基本的层面上,您可以执行此操作来获取单条消息(第一条):

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 和 Message 的消息列表。在这种情况下,请考虑:

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。选择它的父级,或者它的父级的父级(就像您所做的那样)是不够的。

关于c# - xdoc 查询的 Select 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341145/

相关文章:

ios - 用 XML 字符串填充数组

Linq 使用 select new 中的值来计算另一个字段

c# - 可空变量在内存分配中的优势 C#

c# - 尝试使用 C# 打开 Microsoft Powerpoint 文件时出现文件损坏错误

c# - 配置系统初始化失败,外部配置文件

c# - 如何处理 XmlReader.Create 的异常

ruby-on-rails - 如何验证大 XML

c# - 从字符串中获取数字

c# - 使用 AutoMapper 的 LINQ GroupBy 聚合

c# - LINQ 子选择