c# 中的动态 XML 解析、数据存储和表单
Dynamic XML parsing, data storage, and forms in c#
所以我正在开发一个应用程序,我希望能够动态解析 xml 文件,获取属性并填充根据 xml 中存在的元素创建的表单文件。然后可以编辑这些值,并将其写回最初打开的 xml 文件。
我已经能够解析,将值保存到数据库,填充表单,并通过硬编码写回原始 xml 文件,我想我对动态 "database" 结构(一个字典,其中键是节点的名称,如果我想存储节点的子节点信息,则值为字典,如果我在元素的最远嵌套子节点中,则值为字符串)。
我一直在思考如何获取我需要的信息以及如何将其存储在我提出的 "database" 结构中。我做过研究,看到人们使用 "dynamic" 对象和 linq。但是我所看到的一切似乎都涉及在 运行 时间之前知道他们需要的路径名。关于我应该如何实际解析文件和获取数据的任何想法,首先?我想如果我能弄清楚这一点,剩下的应该就位了。
说我有这个xml
<users>
<user1 age="43">John Doe</user1>
<user2 age="40">Jane Doe</user2>
</users>
示例数据库设置如下所示 Dictionary<users, Dictionary<user1, Dictionary<name,John Doe>
你可以去哪里 Key("users").Key("user1").Key("name").Value
找 John Doe 或类似的人。
对于我的数据库设置的任何其他建议也将不胜感激
您可以使用 XmlDocument class 解析 xml。解析后你有节点树,你可以遍历并显示在 UI 中。我不明白为什么要将 xml 保存为数据库中不同的值记录,只需将其保存为文本即可。无论如何,为了保存 xml,您应该将其记录翻译回 xml。
听起来您正在寻找的是 XML 序列化。不过,在您可以这样做之前,您需要简化您的 xml。您将希望使用具有用户 ID 值的属性,而不是对 <user>
元素进行编号。例如,您可以使用 id
属性。
<users>
<user id="1" age="43">John Doe</user>
<user id="2" age="40">Jane Doe</user>
</users>
完成此操作后,创建一个 class,您可以将其序列化到此 xml。
using System.Xml.Serialization;
[XmlRoot(ElementName = "users")]
public class Users : List<User>
{
}
[XmlType(TypeName = "user")]
public class User
{
[XmlAttribute(AttributeName = "id")]
public int Id { get; set; }
[XmlAttribute(AttributeName = "age")]
public int Age { get; set; }
[XmlText]
public string Name { get; set; }
}
那么从文件中加载所需要做的就是反序列化。
XmlSerializer serializer = new XmlSerializer(typeof(Users));
Users users = (Users)serializer.Deserialize(File.OpenRead("XMLFile1.xml"));
您可以使用 LINQ 查询特定用户的 Users
集合。
var user1 = users.Where(u => u.Id == 1)
修改 User
对象或将更多对象添加到 Users
集合,然后序列化以将更改保存回文件。
XmlSerializer serializer = new XmlSerializer(typeof(Users));
serializer.Serialize(File.OpenWrite("XMLFile1.xml"), users);
所以我正在开发一个应用程序,我希望能够动态解析 xml 文件,获取属性并填充根据 xml 中存在的元素创建的表单文件。然后可以编辑这些值,并将其写回最初打开的 xml 文件。
我已经能够解析,将值保存到数据库,填充表单,并通过硬编码写回原始 xml 文件,我想我对动态 "database" 结构(一个字典,其中键是节点的名称,如果我想存储节点的子节点信息,则值为字典,如果我在元素的最远嵌套子节点中,则值为字符串)。
我一直在思考如何获取我需要的信息以及如何将其存储在我提出的 "database" 结构中。我做过研究,看到人们使用 "dynamic" 对象和 linq。但是我所看到的一切似乎都涉及在 运行 时间之前知道他们需要的路径名。关于我应该如何实际解析文件和获取数据的任何想法,首先?我想如果我能弄清楚这一点,剩下的应该就位了。
说我有这个xml
<users>
<user1 age="43">John Doe</user1>
<user2 age="40">Jane Doe</user2>
</users>
示例数据库设置如下所示 Dictionary<users, Dictionary<user1, Dictionary<name,John Doe>
你可以去哪里 Key("users").Key("user1").Key("name").Value
找 John Doe 或类似的人。
对于我的数据库设置的任何其他建议也将不胜感激
您可以使用 XmlDocument class 解析 xml。解析后你有节点树,你可以遍历并显示在 UI 中。我不明白为什么要将 xml 保存为数据库中不同的值记录,只需将其保存为文本即可。无论如何,为了保存 xml,您应该将其记录翻译回 xml。
听起来您正在寻找的是 XML 序列化。不过,在您可以这样做之前,您需要简化您的 xml。您将希望使用具有用户 ID 值的属性,而不是对 <user>
元素进行编号。例如,您可以使用 id
属性。
<users>
<user id="1" age="43">John Doe</user>
<user id="2" age="40">Jane Doe</user>
</users>
完成此操作后,创建一个 class,您可以将其序列化到此 xml。
using System.Xml.Serialization;
[XmlRoot(ElementName = "users")]
public class Users : List<User>
{
}
[XmlType(TypeName = "user")]
public class User
{
[XmlAttribute(AttributeName = "id")]
public int Id { get; set; }
[XmlAttribute(AttributeName = "age")]
public int Age { get; set; }
[XmlText]
public string Name { get; set; }
}
那么从文件中加载所需要做的就是反序列化。
XmlSerializer serializer = new XmlSerializer(typeof(Users));
Users users = (Users)serializer.Deserialize(File.OpenRead("XMLFile1.xml"));
您可以使用 LINQ 查询特定用户的 Users
集合。
var user1 = users.Where(u => u.Id == 1)
修改 User
对象或将更多对象添加到 Users
集合,然后序列化以将更改保存回文件。
XmlSerializer serializer = new XmlSerializer(typeof(Users));
serializer.Serialize(File.OpenWrite("XMLFile1.xml"), users);