【问题标题】:User defined xml transformation用户定义的 xml 转换
【发布时间】:2009-09-24 07:01:14
【问题描述】:

我有一些示例 xml 数据,例如:

<?xml version="1.0" encoding="utf-8"?>
<Account>
<User>
  <FirstName>John</FirstName>
  <LastName>Doe</LastName>
</User>
<LoginDetails Sequence="1">
  <LoginDate>01/01/09</LoginDate>
  <Status>Successful</Status>
</LoginDetails>
<LoginDetails Sequence="2">
  <LoginDate>01/02/09</LoginDate>
  <Status>Failed</Status>
</LoginDetails>
</Account>

我有这个 xml 的架构文件。 我想提供允许最终用户执行以下操作的功能:

  1. 定义要显示的元素。
  2. 为每个元素定义一个标签。
  3. 让用户能够保存这些信息,然后在我的应用程序运行时加载真正的 xml 数据时使用它。

我在想也许我可以使用 LINQ 或动态 LINQ 来执行此操作。我想我可以首先解析 xml 或使用模式来显示所有节点的列表(可能在树视图中?)并让用户检查他们想要显示的元素并输入标签。

这听起来是个好主意吗?我正在考虑使用 XSLT,但我认为它在 LINQ 中可能更容易。谁能提供一些链接或信息来帮助我实现这一目标?有没有更好的解决方案?

【问题讨论】:

  • 您能否更准确地指定用户应该能够“定义要显示的元素”和“为每个元素定义标签”的程度?您是指输入 XML 中的每个元素,还是只是根的直接子元素?此外,给定输入 XML 和规则,所需的输出是什么 - HTML/ASP.NET?赢表格? WPF 窗口/页面?

标签: .net xml linq dynamic transformation


【解决方案1】:

您可以使用 XSLT - 请记住,它很难阅读和维护。如果您确实使用 XSLT,我建议您可以使用一个名为 MapForce 的好工具(如果您负担得起的话),它将帮助您使用所见即所得的编辑器创建 XSLT 文件。

【讨论】:

  • 感谢您的回复!是的,我正在尝试 XSLT,但我想到了 Linq b/c 我很难使用 XSLT,而且我认为对于最终会使用这个项目的其他程序员来说会更容易。我遇到的问题是我不确定该怎么做。我知道从我读过的内容来看应该是可能的,但我需要一些帮助才能开始。
  • 如上所述,您的任务比 LINQ to XML 更适合 XSLT。特别是因为 XSLT 在这种情况下如何显示数据的用户配置。
  • 所以我应该根据用户从用户界面(树视图或列表或其他)中选择的内容生成一个 xslt,然后保存它?如果是这样,如果他们想重新加载他们所做的任何设置并进行更改怎么办。阅读 xslt 然后尝试重新创建在用户界面中选择的设置似乎有点尴尬,不是吗?我在想如果我可以将一些对象映射到 xml,然后用它来序列化用户的设置,那么检索和再次显示会更容易吗?
  • 哦,我明白你的意思了。通过“最终用户可定制”,我假设一些相当高级的最终用户(能够只编辑 XSLT 以获得他们想要的输出 - 这是最灵活的选项)。如果您希望它是 UI 驱动的,那就另当别论了,尽管它可能仍然不会改变 XSLT(在本例中为参数化)可能比 LINQ 更适合转换的事实。
【解决方案2】:

最终用户不需要知道 XSLT,但我确实需要提供一种简单的方法让他们决定要显示或不显示哪个元素。

因此,似乎最好的答案是创建一个 UI,允许用户选择他们想要显示的节点,然后简单地将这些信息序列化为一个简单的 xml 文件,这样如果他们需要重新加载,我可以反序列化它设置页面并稍后更改。

然后我可以根据这些设置生成 XSLT 并利用它来转换传入的 xml?也许,我可以为高级用户提供直接编辑 XSLT 的能力?

这看起来合理吗?

【讨论】:

  • 是的,这看起来确实很合理。允许用户直接提供 XSLT 是一个不错的选择,因为有很多强大的“可视化”XSLT 编辑工具可以让用户从输入 XML 开始,并配置他想要的输出方式(IIRC Altova 提供了类似的东西) .对于您提供自己的可视化编辑器并将它们保存到配置 XML 的情况,您实际上也可以使用 XSLT 将该 XML 转换为 XSLT :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
相关资源
最近更新 更多