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只会迭代每个元素上存在的内容-它无法猜测缺少的内容。我认为您可以通过以下方式解决问题:
当然,您必须存储和解析生成的实体。我不是说这是解决您的特定问题的最佳或正确的方法,但是,我提供它作为您可以做的一个简要示例(因此缺少异常/错误处理等)
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();
}