【问题标题】:Dynamic XML parsing, data storage, and forms in c#c# 中的动态 XML 解析、数据存储和表单
【发布时间】:2015-06-10 18:16:11
【问题描述】:

所以我正在开发一个应用程序,我希望它能够动态解析 xml 文件、获取属性并填充基于 xml 文件中存在的元素创建的表单。然后可以编辑这些值,并将其写回到最初打开的 xml 文件中。

我已经能够解析、将值保存到数据库、填充表单并通过硬编码写回原始 xml 文件,我想我对动态“数据库”结构(一个字典,其中键是节点的名称,如果我想存储节点的子节点信息,则值为字典,如果我在元素的最远嵌套子节点中,则为字符串。

我被困在如何获取我需要的信息以及如何将其存储在我想出的“数据库”结构中。我做过研究,看到人们使用“动态”对象和 linq。但我所看到的一切似乎都涉及在运行时知道他们需要的路径名。关于我应该如何实际解析文件和获取数据的任何想法,首先?我想如果我能弄清楚这一点,其余的应该就位了。

假设我有这个 xml

<users> <user1 age="43">John Doe</user1> <user2 age="40">Jane Doe</user2> </users>

一个示例数据库设置类似于Dictionary&lt;users, Dictionary&lt;user1, Dictionary&lt;name,John Doe&gt;

你可以去哪里 Key("users").Key("user1").Key("name").Value 得到 John Doe 或类似的东西。

对于我的数据库设置的任何其他建议也将不胜感激

【问题讨论】:

  • 我会研究 xml 序列化。在我看来,这是进行 xml 解析的最简单和最有效的方法。 msdn.microsoft.com/en-us/library/58a18dwa%28v=vs.110%29.aspx
  • 为什么对于看起来相同的元素有不同的标签定义(user1 和 user2)?如果您需要指定用户 ID,&lt;user id="1" age="43"&gt;John Doe&lt;/user&gt; 会更惯用。
  • 我想我这样做是因为我将标签名称作为嵌入字典行下方的某个键,并且有多个用户,所以我的键名不会是唯一的。

标签: c# xml parsing dynamic data-storage


【解决方案1】:

听起来您正在寻找的是 XML 序列化。不过,在您这样做之前,您需要简化您的 xml。您将希望使用具有用户 ID 值的属性,而不是对 &lt;user&gt; 元素进行编号。例如,您可以使用 id 属性。

<users>
  <user id="1" age="43">John Doe</user>
  <user id="2" age="40">Jane Doe</user>
</users>

完成此操作后,创建一个可以序列化到此 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。这不是只适用于只读取“users.xml”格式的文件的静态应用程序吗?
  • 是的,这仅适用于一种格式。为了处理文件,您必须在编译时了解有关格式的信息。你会知道什么?是否有可能提出一种可以捕获您需要的所有信息的单一格式?如果这是一个选项,它可能比拥有一堆解析和持久化代码更好。
  • 我只知道有一个有孩子的根节点。就是这样。
【解决方案2】:

您可以使用 XmlDocument 类解析 xml。解析后,您有可以遍历并在 UI 中显示的节点树。我不明白为什么要将 xml 保存为数据库中值的不同记录,只需将其保存为文本。无论如何,要保存 xml,您应该将其记录转换回 xml。

【讨论】:

  • 所以我使用了 XmlDocument 方法来解析我的文件,效果很好。现在我想使用字典来存储我的数据,因为我希望能够根据具有相同父节点的数据对表单上的控件进行分组。我让它适用于没有同名叶节点的文件。但它需要对两者都有效。存储按父元素保留此“分组”的数据的有效方法是什么?
猜你喜欢
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多