【问题标题】:Creating XDocument based on existing XML file基于现有 XML 文件创建 XDocument
【发布时间】:2015-04-27 01:20:13
【问题描述】:

我正在尝试基于现有 XML 文件创建 XDocument 并将其与 TreeView 一起使用。我想按 Group 元素对联系人进行分组。

XML 文件结构 -

<Contacts>
  <Contact>
    <First_Name>Ren</First_Name>
    <Last_Name>Fuji</Last_Name>
    <Group>Test</Group>
    <Home_Number>Unavailable</Home_Number>
    <Mobile_Number>Unavailable</Mobile_Number>
    <Image></Image>
  </Contact>
<Contacts>

这是创建 XDocument 对象的方法 -

     static XDocument groupXDoc = new XDocument();
     private static void CreateGroupsXML()
            {
                XElement root = new XElement("Groups");
                groupXDoc.Add(root);
                foreach (XElement xelement in xdoc.Element("Contacts").Elements("Contact").ToList())
                {
                    String groupData = (String)xelement.Element("Group").Value;
                    XElement groups = new XElement("Group", new XAttribute("Name", groupData));
                    root.Add(groups);
                    if (groupXDoc.Root.Element("Group").FirstAttribute.Value == xelement.Element("Group").Value)
                    {
                        groups.Add(new XElement("First_Name", (String)xelement.Element("First_Name").Value),
                            new XElement("Last_Name", (String)xelement.Element("Last_Name").Value),
                            new XElement("Home_Number", (String)xelement.Element("Home_Number").Value),
                            new XElement("Mobile_Number", (String)xelement.Element("Mobile_Number").Value)
                            );
                    }
                }
            }

然而这就是我得到的结果 -

您可以看到只有第一个联系人正确显示,但其他两个没有。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c# winforms linq-to-xml


    【解决方案1】:
    private static XDocument GroupContactsByGroupField(XDocument doc)
        {
            var contacts = doc.Descendants("Contact").Select(x => new
            {
                FirstName = x.Element("First_Name").Value,
                LastName = x.Element("Last_Name").Value,
                Group = x.Element("Group").Value,
                HomeNumber = x.Element("Home_Number").Value,
                MobileNumber = x.Element("Mobile_Number").Value
            });
            var contactsGroupedByGroup = contacts.GroupBy(x => x.Group);
    
            var newDoc = new XDocument(new XElement("Groups", contactsGroupedByGroup.Select(x =>
               new XElement("Group", new XAttribute("Name", x.Key),
                x.Select(y => new XElement("Contact",
                    new XElement("First_Name", y.FirstName),
                    new XElement("Last_Name", y.LastName),
                    new XElement("Home_Number", y.HomeNumber),
                    new XElement("Mobile_Number", y.MobileNumber)
                ))))));
            return newDoc;
        }
    

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 2011-06-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多