将XML转换为新XML格式的方法如果使用对象,则限制配置能力
本文关键字:XML 对象 能力 配置 如果 转换 格式 方法 | 更新日期: 2023-09-27 17:54:11
有一个关于XML从一种格式转换为另一种格式的方法的问题。
我正在处理一个任务,在这个任务中,我从一个我无法控制的对象中获取序列化数据。我已经为这个XML生成了一个对象。我们称它为"表单实例"。Form Instance是非常复杂的嵌套,和许多不相关的布局组件和嵌套,我的理解使得很难使用XSLT。
我需要采取的形式实例,并分配属性从它的值在另一个对象。我们称另一个对象为"Standard Format"。标准格式对象将自身序列化为我最终需要的格式。
表单实例是用户填写表单的结果序列化。这个表单的"定义"可以随时更改,并且像表单的布局更改这样简单的事情完全改变了结果序列化的嵌套结构-一致的是,在序列化控件的某个地方表示我需要的值-并且我想要配置我想要的值。
我正在创建我自己的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>
正如你所看到的,我不介意在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被认为是一个参与者,那么它可以在标准格式对象中的"下面,或者可以嵌套在"之类的其他对象下面。我有多个表单,但每个表单中的所有"控件"将具有相同的输出。所以在这种情况下,主表单将有一堆不同的person,它们都需要以相同的格式出现。
那么如果我绕过标准格式对象,如果最终我们需要的只是一个序列化输出,这不好吗?
谢谢你的建议
我个人认为xslt仍然是最好的选择;对于XML转换来说,它确实是非常通用的。
如果你的数据是基于对象的,你可以看到是否XmlAttributeOverrides(你可以提供给XmlSerializer)做你需要的;它允许与代码属性无关的XML映射,从而允许同一模型的并行映射-但它不像xslt扫描那样丰富;并且您需要小心缓存和重用使用xmlattrtributeoverrides创建的任何XmlSerializer实例,否则它将泄漏不可收集的动态程序集。