C# C语言中的复杂嵌套XML解析#

C# C语言中的复杂嵌套XML解析#,c#,xml,parsing,linq-to-xml,C#,Xml,Parsing,Linq To Xml,迄今为止的代码。输出如下所示 var doc = XDocument.Load(path + "\\" + file + ".xml"); var root = doc.Root; foreach (XElement el in root.Elements()) { // Console.WriteLine(el.Nodes()); // Console.WriteLine(el

迄今为止的代码。输出如下所示

 var doc = XDocument.Load(path + "\\" + file + ".xml");

        var root = doc.Root;
        foreach (XElement el in root.Elements())
        {

               // Console.WriteLine(el.Nodes());
                //  Console.WriteLine(el.Value);
                //Console.WriteLine("  Attributes:");
                foreach (XAttribute attr in el.Attributes())
                {

                    Console.WriteLine(attr);
                 //   Console.WriteLine(el.Elements("id"));


                }

           Console.WriteLine("---------------------------");

          // foreach (XElement element in el.Elements())
       //    {

     //          Console.WriteLine("    {0}: {1}", element.Name, element.Value);
      //     }

           }
            //hold console open
            Console.ReadLine();

        }
我基本上需要提取每一条信息,以便将它们存储在一个表布局中。
我对使用XML解析相当陌生,因此希望您能提供帮助。

只有您知道允许的属性名称cabinet…Client。简单的暴力方法是提取每个预期属性,然后您将知道缺少哪些属性,并可以将单元格设置为空。Foreach只会迭代每个元素上存在的内容-它无法猜测缺少的内容。

我认为您可以通过以下方式解决问题:

  • 创建一个名为BaseNode的类

  • 您可以为所有实体类型创建扩展BaseNode的类

  • 创建一组规则,这些规则基于节点确定首选实体类型

  • 在BaseNode类中创建generateEntity方法

  • 您使用这个算法(这不是代码,所以不要试图编译它)

  • 解析XML(节点)

    结束解析XML


    当然,您必须存储和解析生成的实体。

    我不是说这是解决您的特定问题的最佳或正确的方法,但是,我提供它作为您可以做的一个简要示例(因此缺少异常/错误处理等)

    namespace so.consoleapp
    {
    使用制度;
    使用System.Collections.Generic;
    使用System.Xml.Linq;
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    var doc=XElement.Load(“file.xml”);
    var activityElements=单据要素(“活动”);
    ICollection CollectionFactivities=新列表();
    foreach(activityElements中的var activityElement)
    {
    var storageObjectElement=activityElement.Element(“storageObject”);
    字符串clientElement=null;
    if(storageObjectElement.Element(“客户端”)!=null)
    {
    clientElement=storageObjectElement.Element(“客户端”).Value;
    }
    var newStorageObject=新存储对象
    {
    客户端=客户端元素,
    Author=storageObjectElement.Element(“Author”).Value
    };
    var userElement=activityElement.Element(“用户”);
    var newUser=新用户
    {
    Id=userElement.Attribute(“Id”).Value,
    Name=userElement.Attribute(“Name”).Value,
    MemberType=userElement.Attribute(“MemberType”).Value
    };
    收集工厂。添加
    (
    新活动
    {
    日期=activityElement.Attribute(“日期”).Value,
    Name=activityElement.Attribute(“Name”).Value,
    Host=activityElement.Attribute(“Host”).Value,
    User=newUser,
    StorageObject=新闻存储对象
    }
    );
    }
    Console.ReadLine();
    }
    }
    课堂活动
    {
    公共字符串日期
    {
    收到
    设置
    }
    公共字符串名
    {
    收到
    设置
    }
    公共字符串主机
    {
    收到
    设置
    }
    公共用户
    {
    收到
    设置
    }
    公共存储对象存储对象
    {
    收到
    设置
    }
    }
    类用户
    {
    公共字符串Id
    {
    收到
    设置
    }
    公共字符串名
    {
    收到
    设置
    }
    公共字符串成员类型
    {
    收到
    设置
    }
    }
    类存储对象
    {
    公共字符串客户端
    {
    收到
    设置
    }
    公共字符串作者
    {
    收到
    设置
    }
    }
    }
    
    试试这样的方法。创建一个新的
    Windows窗体应用程序
    ,将一个
    DataGrid
    控件添加到窗体和代码隐藏,如下所示:

    namespace so.consoleapp
    {
        using System;
        using System.Collections.Generic;
        using System.Xml.Linq;
    
        class Program
        {
            static void Main(string[] args)
            {
                var doc = XElement.Load("file.xml");
                var activityElements = doc.Elements("activity");
    
                ICollection<Activity> collectionOfActivities = new List<Activity>();
                foreach (var activityElement in activityElements)
                {
                    var storageObjectElement = activityElement.Element("storageObject");
    
                    string clientElement = null;
                    if (storageObjectElement.Element("Client") != null)
                    {
                        clientElement = storageObjectElement.Element("Client").Value;
                    }
    
                    var newStorageObject = new StorageObject
                    {
                        Client = clientElement,
                        Author = storageObjectElement.Element("Author").Value
                    };
    
                    var userElement = activityElement.Element("user");
                    var newUser = new User
                    {
                        Id = userElement.Attribute("id").Value,
                        Name = userElement.Attribute("name").Value,
                        MemberType = userElement.Attribute("memberType").Value
                    };
    
                    collectionOfActivities.Add
                    (
                        new Activity
                        {
                            Date = activityElement.Attribute("date").Value,
                            Name = activityElement.Attribute("name").Value,
                            Host = activityElement.Attribute("host").Value,
                            User = newUser,
                            StorageObject = newStorageObject
                        }
                    );
                }
    
                Console.ReadLine();
            }
        }
    
        class Activity
        {
            public string Date
            {
                get;
                set;
            }
    
            public string Name
            {
                get;
                set;
            }
    
            public string Host
            {
                get;
                set;
            }
    
            public User User
            {
                get;
                set;
            }
    
            public StorageObject StorageObject
            {
                get;
                set;
            }
        }
    
        class User
        {
            public string Id
            {
                get;
                set;
            }
    
            public string Name
            {
                get;
                set;
            }
    
            public string MemberType
            {
                get;
                set;
            }
        }
    
        class StorageObject
        {
            public string Client
            {
                get;
                set;
            }
    
            public string Author
            {
                get;
                set;
            }
        }
    }
    
    private void Form1\u加载(对象发送方,事件参数e)
    {
    填充_datagrid(dataGridView1);
    }
    专用void填充\u datagrid(DataGridView dataGridView1)
    {
    字符串xml_字符串=@“
    NG-5MIYABBV
    法律文件
    乔·布洛格斯
    1001
    R1234
    NG-5MIYABBV
    法律文件
    abc
    R1234
    NG-5MIYABBV
    法律文件
    bca
    1001
    
    date="2013-07-06T17:07:42"
    name="open"
    host="213.146.142.50
    
    for each node in node do
    
        BaseNode.generateEntity(node.input)
    
        if (node.hasChildren())
    
            parseXML(node)
    
        end if
    
    end for
    
    namespace so.consoleapp
    {
        using System;
        using System.Collections.Generic;
        using System.Xml.Linq;
    
        class Program
        {
            static void Main(string[] args)
            {
                var doc = XElement.Load("file.xml");
                var activityElements = doc.Elements("activity");
    
                ICollection<Activity> collectionOfActivities = new List<Activity>();
                foreach (var activityElement in activityElements)
                {
                    var storageObjectElement = activityElement.Element("storageObject");
    
                    string clientElement = null;
                    if (storageObjectElement.Element("Client") != null)
                    {
                        clientElement = storageObjectElement.Element("Client").Value;
                    }
    
                    var newStorageObject = new StorageObject
                    {
                        Client = clientElement,
                        Author = storageObjectElement.Element("Author").Value
                    };
    
                    var userElement = activityElement.Element("user");
                    var newUser = new User
                    {
                        Id = userElement.Attribute("id").Value,
                        Name = userElement.Attribute("name").Value,
                        MemberType = userElement.Attribute("memberType").Value
                    };
    
                    collectionOfActivities.Add
                    (
                        new Activity
                        {
                            Date = activityElement.Attribute("date").Value,
                            Name = activityElement.Attribute("name").Value,
                            Host = activityElement.Attribute("host").Value,
                            User = newUser,
                            StorageObject = newStorageObject
                        }
                    );
                }
    
                Console.ReadLine();
            }
        }
    
        class Activity
        {
            public string Date
            {
                get;
                set;
            }
    
            public string Name
            {
                get;
                set;
            }
    
            public string Host
            {
                get;
                set;
            }
    
            public User User
            {
                get;
                set;
            }
    
            public StorageObject StorageObject
            {
                get;
                set;
            }
        }
    
        class User
        {
            public string Id
            {
                get;
                set;
            }
    
            public string Name
            {
                get;
                set;
            }
    
            public string MemberType
            {
                get;
                set;
            }
        }
    
        class StorageObject
        {
            public string Client
            {
                get;
                set;
            }
    
            public string Author
            {
                get;
                set;
            }
        }
    }
    
    private void Form1_Load(object sender, EventArgs e)
            {
                populate_datagrid(dataGridView1);
            }
    
            private void populate_datagrid(DataGridView dataGridView1)
            {
                String xml_string = @"<ndActivityLog repositoryId=""AA-AAAA1AAA"" repositoryName=""Company Name"" startDate=""2013-07-05"" endDate=""2013-07-06"">
                                        <activity date=""2013-07-05T06:42:35"" name=""open"" host=""00.00.00.00"">
                                            <user id=""joebloggs@email.com"" name=""Joe Bloggs"" memberType=""I"" /> 
                                            <storageObject docId=""0000-0000-0000"" name=""Opinion"" size=""356864"" fileExtension=""doc"">
                                                <cabinet name=""Client and Matters"">NG-5MIYABBV</cabinet> 
                                                <DocumentType>Legal Document</DocumentType> 
                                                <Author>Joe Bloggs</Author> 
                                                <Matter>1001</Matter> 
                                                <Client>R1234</Client> 
                                            </storageObject>
                                        </activity>
                                        <activity date=""2013-06-05T06:42:35"" name=""close"" host=""00.00.00.00"">
                                            <user id=""abc@bca.com"" name=""abc"" memberType=""I"" /> 
                                            <storageObject docId=""0000-0000-0000"" name=""Opinion"" size=""25630"" fileExtension=""doc"">
                                                <cabinet name=""Client and Matters"">NG-5MIYABBV</cabinet> 
                                                <DocumentType>Legal Document</DocumentType> 
                                                <Author>abc</Author> 
                                                <Client>R1234</Client> 
                                            </storageObject>
                                        </activity>
                                        <activity date=""2013-06-05T06:42:35"" name=""unknown"" host=""00.00.00.00"">
                                            <user id=""bca@abc.com"" name=""bca"" memberType=""I"" /> 
                                            <storageObject docId=""0000-0000-0000"" name=""Opinion"" size=""45875"" fileExtension=""doc"">
                                                <cabinet name=""Client and Matters"">NG-5MIYABBV</cabinet> 
                                                <DocumentType>Legal Document</DocumentType> 
                                                <Author>bca</Author> 
                                                <Matter>1001</Matter> 
                                            </storageObject>
                                        </activity>
                                        <activity date=""2013-06-05T06:42:35"" name=""open"" host=""00.00.00.00"">
                                            <user id=""cab@abc.com"" name=""cab"" memberType=""I"" /> 
                                            <storageObject docId=""0000-0000-0000"" name=""Opinion"" size=""45875"" fileExtension=""doc"">
                                                <cabinet name=""Client and Matters"">NG-5MIYABBV</cabinet> 
                                                <DocumentType>Legal Document</DocumentType>
                                            </storageObject>
                                        </activity>
                                    </ndActivityLog>";
    
                var query = from XElement c in System.Xml.Linq.XElement.Parse(xml_string).Descendants("activity")
                            select new
                            {
                                user = c.Elements("user").First().Attribute("name").Value,
                                author = c.Descendants("Author").Count() > 0 ? c.Descendants("Author").First().Value : "n/a",
                                matter = c.Descendants("Matter").Count() > 0 ? c.Elements("Matter").First().Value : "n/a"
                            };
    
                dataGridView1.DataSource = query.ToList();
    
            }