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);