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