1

对将 XML 从一种格式转换为另一种格式的方法有疑问。

我正在从事一项任务,其中我从我无法控制的对象中获取序列化数据。我已经为这个 XML 生成了一个对象。让我们称之为“表单实例”。表单实例的嵌套非常复杂,并且有许多不相关的布局组件和嵌套,我的理解使得很难使用 XSLT 来实现这一点。

我需要获取 Form 实例,并将其属性分配给另一个对象中的值。让我们称另一个对象为“标准格式”。标准格式对象将自己序列化为我最终需要达到的格式。

表单实例是用户填写表单的结果序列化。可以随时更改此表单“定义”,并且像对表单的布局更改这样简单的事情会完全改变结果序列化的嵌套结构 - 一致的是序列化中的某处表示我需要来自的值的控件 - 而且我想要配置我想要的值。

我正在创建自己的 XML“配置文件”,它将允许指定表单实例中的哪些控件最终要加载到“标准格式”对象中。

表单实例的结构如下:

<Form name="MainForm">
<Control type="GroupHeader">
<Control type="GroupHeader">
<Control type="text" name="FirstName"/>
<Control type="text" name="LastName"/>
</Control>
<Control type="Radio" name="Gender"/>
</Control>
<Control>
<Form name="SomeOtherSubForm">
<Control type="text" name="AnotherPersonFirstName"/>
<Control type="text" name="AnotherPersonLastName"/>
</Form>
</Control>
</Form>

正如您所看到的,我并不介意表单实例中存在字段的位置(如果有人删除组标题或添加一些新布局,它可以随时更改),因为如果我创建一个配置文件,我可以递归地访问它们控制“名称”。

我想让我的“配置文件”足够重用,因为当数据添加到“表单实例”时,可以对我的配置文件进行调整,说“我现在想要这个其他控件已添加到表单定义中”,这会将其写入“标准格式”。此外,我也希望可以从此文件配置最终输出。

“标准格式”对象中的序列化让我得到了我需要的东西——如果我以一种特定于我想要结束的方式使用它(它是灵活的)。但是我想知道,如何将表单实例数据放置到该对象中 - 可配置。如果我将它作为一个对象使用,那么当需要更改生成的序列化格式时,我需要更改代码。

我想错了吗,既然我知道“标准格式”对象输出什么,我可以在“配置文件”中创建一个类似令牌的配置部分以允许指定格式?

例如:在我的“表单实例”上,我至少有 2 个字段,我希望最终以“标准格式”序列化的方式表示。如果有人更改了已定义的基础表单的定义,这两个字段可以随时更改“表单实例”序列化中的位置/嵌套。

由于我们的目标不是使用标准格式对象,而是最终得到它序列化的内容,我是否可以将对象步骤去掉,只对我想要的 XML 建模。例如,如果我向其添加“Person”对象,这就是标准格式将产生的结果。

<StandardFormat>
  <Person Gender="M">
    <Name>
      <First>Joe</First>
      <Last>Smith</Last>
    </Name>
  </Person>
</StandardFormat>

像这样制作我的 XML 配置文件是否可行:

<FormInstanceOutputConfiguration> 
  <Control id="FirstName" type="TextField">
  <Control id="LastName" type="TextField">
  <Control id="Gender" type="Radio">
  <CustomOutputTemplate>
    <Person Gender="[Gender]">
      <Name>
        <First>[FirstName]</First>
        <Last>[LastName]</Last>
      </Name>
    </Person>
  </CustomOutputTemplate>
</FormInstanceOutputConfiguration>

无需更改“标准格式”模型即可更改所需的输出。如果在这种情况下 Person 被认为是一个演员,它可以在标准格式对象中的“”下,或者它可以嵌套在类似“”之类的其他东西下。我有多个表单,但每个表单中的所有“控件”都将具有相同的输出。所以在这种情况下,主表单将有一堆不同的人都需要以相同的格式出现。

那么,如果我绕过标准格式对象,如果最终我们需要的只是序列化输出,那是不是很糟糕?

谢谢你的任何想法。

4

1 回答 1

1

我个人认为 xslt 仍然是您最好的选择;对于 XML 转换,它确实非常通用。

如果您的数据是基于对象的,您可以查看 XmlAttributeOverrides(您可以将其提供给 XmlSerializer)是否满足您的需求;它允许与代码属性无关的 XML 映射,因此允许同一模型的并行映射 - 但它不如xslt 扫描丰富;并且您需要小心缓存和重用使用 XmlAttrributeOverrides 创建的任何 XmlSerializer 实例,否则它将泄漏无法收集的动态程序集。

于 2011-04-30T18:42:51.893 回答