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>

ご覧のとおり、 Form インスタンスのどこにフィールドが存在するかは気にしません (また、誰かがグループ ヘッダーを削除したり、新しいレイアウトを追加したりすると、いつでも変更される可能性があります)。コントロール「名前」。

「フォーム インスタンス」にデータが追加されたときに、構成ファイルを調整できるという意味で、「構成ファイル」を十分に再利用できるようにしたいと考えています。 「フォーム定義に追加されました」は、「標準フォーマット」に書き込みます。また、最終的な出力もこのファイルから構成できるようにしたいと考えています。

「標準フォーマット」オブジェクトでのシリアル化は、必要なものを取得します-最終的にしようとしているものに固有の方法でそれを操作する場合(柔軟性があります)。ただし、フォームインスタンスデータをそのオブジェクトにどのように配置するかをどのように構成できるか疑問に思っています。それをオブジェクトとして扱う場合、結果のシリアライゼーション形式を変更する必要がある場合は、コードを変更する必要があります。

「標準形式」オブジェクトが何を出力するかを知っているので、「構成ファイル」にトークンのような構成セクションを作成して、形式の仕様を許可できると考えるのは間違っていますか?

例:私の「フォームインスタンス」には、最終的に「標準フォーマット」がシリアル化するもので表現したいフィールドが少なくとも2つあります。これらの 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 に答える