c# - 使用 XMLReader 解析糟糕的结构化文件
问题描述
我有以下文件
<container rev="1">
<Folder name="root" access="all">
<Folder name="aaa" access="user1">
...
</Folder>
<Folder name="bbb" access="user2">
...
</Folder>
<Folder name="ccc" access="user1">
...
</Folder>
....
</Folder>
</container>
很多文件夹封装在容器中。问题是遍历此文件夹检查文件夹名称属性的最佳方法是什么?我已经通过 Reader.skip() 和 readtofolowing() 完成了这项工作,但我不喜欢我的解决方案,因为这个文件夹块可以混合。例如需要文件夹“xxx”
解决方案
您只需要一个类来存储Folder
XML 节点的数据。像这个:
public class Folder
{
/// <summary>
/// List of folders in the folder
/// </summary>
[XmlElement(ElementName = "Folder")]
public List<Folder> Folders { get; set; }
/// <summary>
/// Name of the folder
/// </summary>
[XmlAttribute("name")]
public string Name { get; set; }
/// <summary>
/// Access information of the folder
/// </summary>
[XmlAttribute("access")]
public string Access { get; set; }
public override string ToString()
{
var sb = new StringBuilder();
ToString(sb, 0);
return sb.ToString();
}
private void ToString(StringBuilder sb, int level)
{
const int indent = 2;
sb.Append(new string(' ', level * indent));
sb.AppendLine($"{Name} ({Access})");
foreach (var folder in Folders)
folder.ToString(sb, level + 1);
}
}
另一个容器:
public class Container
{
/// <summary>
/// List of folders in the container
/// </summary>
[XmlElement(ElementName = "Folder")]
public List<Folder> Folders { get; set; }
/// <summary>
/// Revision of the container
/// </summary>
[XmlAttribute("rev")]
public string Revision { get; set; }
public override string ToString()
{
var sb = new StringBuilder();
sb.AppendLine($"Container rev: {Revision}");
foreach (var folder in Folders)
sb.AppendLine(folder.ToString());
return sb.ToString();
}
}
使用XmlSerializer反序列化文件。要管理container
根节点,请按照此处XmlRootAttribute
的说明使用。
这里生成的程序:
class Program
{
static void Main(string[] args)
{
var rootAttribute = new XmlRootAttribute { ElementName = "container", IsNullable = true };
var serializer = new XmlSerializer(typeof(Container), rootAttribute);
using (var reader = new StreamReader("./input.xml"))
{
var result = (Container)serializer.Deserialize(reader);
Console.WriteLine(result);
}
}
}
有了这个内容input.xml
:
<container rev="1">
<Folder name="root" access="all">
<Folder name="aaa" access="user1">
<Folder name="aab" access="user2" />
<Folder name="aac" access="user2"/>
</Folder>
<Folder name="bbb" access="user2" />
<Folder name="ccc" access="user1"/>
</Folder>
</container>
输出是:
Container rev: 1
root (all)
aaa (user1)
aab (user2)
aac (user2)
bbb (user2)
ccc (user1)
推荐阅读
- javascript - Python 字典列表在 javascript GET 处理程序中未正确转换
- .net - 从.net core web api中的URL下载大文件
- javascript - 为什么加载图像在 chrome 中不起作用,而在 Mozilla 中正在加载,在 CSS3 中?
- ubuntu - 在 grub 中为 ubuntu 20.04 恢复 zsys 历史记录(或在命令行中恢复到以前的状态)
- python-3.x - python asycio RuntimeWarning:从未等待协程
- excel - 尝试使用 VBA 为现有数据透视表报表创建动态数据范围
- postgresql - 如何删除在某些列上重复的行?
- jquery - 使用 jQuery 的搜索栏功能
- docker - 从运行 ECS 任务的容器中检索元数据时出现连接错误
- return - XQuery:如何从标签中获取特定值?