C# 在C语言中解析一个非XML文件#

C# 在C语言中解析一个非XML文件#,c#,xml,C#,Xml,我正在尝试使用c#解析联合国网站()中的一个XML文件 我经常遇到这个文件的一个问题,就是子标签的数量随着标签的不同而变化。一个例子是子标记 我尝试了许多不同的方法,但不知何故,我似乎总是遇到同样的问题,即标签中的子标签数量不同 我试图实现的是在一个标记下收集所有标记及其值,然后只将我想要的插入我的数据库。例如,如果缺少一个标记,我只需要在数据库中插入前三个名称,而跳过第四个 我尝试过使用Linq to XML,下面是一些示例: XDocument xdoc = XDocu

我正在尝试使用c#解析联合国网站()中的一个XML文件

我经常遇到这个文件的一个问题,就是子标签的数量随着标签的不同而变化。一个例子是子标记

我尝试了许多不同的方法,但不知何故,我似乎总是遇到同样的问题,即标签中的子标签数量不同

我试图实现的是在一个标记下收集所有标记及其值,然后只将我想要的插入我的数据库。例如,如果缺少一个标记,我只需要在数据库中插入前三个名称,而跳过第四个

我尝试过使用Linq to XML,下面是一些示例:

           XDocument xdoc = XDocument.Load(path);

            var tags = (from t in xdoc.Descendants("INDIVIDUALS")
                        from a in t.Elements("INDIVIDUAL")

                        select new
                        {
                            Tag = a.Name,
                            val = a.Value
                        });

            foreach (var obj in tags)
            {
                Console.WriteLine(obj.Tag + " - " + obj.val + "\t");

//insert SQL goes here
            }
或:

但是这个只收集非空的第四个姓名标签

            var q = (from c in xdoc.Descendants("INDIVIDUAL")
                     from _1 in c.Elements("FIRST_NAME")
                     from _2 in c.Elements("SECOND_NAME")
                     from _3 in c.Elements("THIRD_NAME")
                     from _4 in c.Elements("FOURTH_NAME")

                     where _1 != null && _2 != null && _3 != null && _4 != null

                     select new
                     {
                         _1 = c.Element("FIRST_NAME").Value,
                         _2 = c.Element("SECOND_NAME").Value,
                         _3 = c.Element("THIRD_NAME").Value,
                         _4 = c.Element("FOURTH_NAME").Value
                     });

            foreach (var obj in q)
            {
                Console.WriteLine("Person: " + obj._1 + " - " + obj._2 + " - " + obj._3 + " - " + obj._4);
//insert SQL goes here
            }

什么想法??< /P> < p>而不是在元素上调用值,考虑使用字符串强制转换。如果元素不存在,LINQtoXML安全地返回null。请尝试以下操作:

var  data = XElement.Load(@"http://www.un.org/sc/committees/1267/AQList.xml");
var individuals = data.Descendants("INDIVIDUAL")
    .Select(i => new {
        First = (string)i.Element("FIRST_NAME"),
        Middle = (string)i.Element("SECOND_NAME"),
        Last = (string)i.Element("THIRD_NAME")
    });
如果您想更灵活地获得所有的名称字段,可以执行以下操作。(我将把个人分组的过程作为额外的家庭作业;-)


为什么不使用
XmlSerializer
和LINQ呢

如回答中所述,通过粘贴在新的CS文件中生成类:

菜单编辑>粘贴特殊内容>将XML粘贴为类。

然后按如下方式轻松获取数据:

var serializer = new XmlSerializer(typeof (CONSOLIDATED_LIST));
using (FileStream fileStream = File.OpenRead(@"..\..\aqlist.xml"))
{
    var list = serializer.Deserialize(fileStream) as CONSOLIDATED_LIST;
    if (list != null)
    {
        var enumerable = list.INDIVIDUALS.Select(s => new
        {
            FirstName = s.FIRST_NAME,
            SecondName = s.SECOND_NAME,
            ThirdName = s.THIRD_NAME,
            FourthName = s.FOURTH_NAME
        });
    }
}

然后可以指定更适合您需要的任何谓词


走这条路将节省大量时间,而且不容易出错,无需使用字符串访问字段、强键入等…

这是非常好和有用的。有没有一种方法可以动态读取标记,而无需对这些标记进行硬编码:first_name、second等?当然,您可以使用类似于
data.subjections(“个人”).Elements()的内容来获取名称/值。其中(i=>i.name.LocalName.EndsWith(“_name”))。选择(i=>new{FieldName=i.name.LocalName,Value=i.Value})您可能还需要为每个人添加分组操作或子选择。由您根据业务需求处理解析。看起来他们的数据需要一些标准化。有些情况下,您可能需要首先拆分多个名称。
var serializer = new XmlSerializer(typeof (CONSOLIDATED_LIST));
using (FileStream fileStream = File.OpenRead(@"..\..\aqlist.xml"))
{
    var list = serializer.Deserialize(fileStream) as CONSOLIDATED_LIST;
    if (list != null)
    {
        var enumerable = list.INDIVIDUALS.Select(s => new
        {
            FirstName = s.FIRST_NAME,
            SecondName = s.SECOND_NAME,
            ThirdName = s.THIRD_NAME,
            FourthName = s.FOURTH_NAME
        });
    }
}