web-dev-qa-db-ja.com

非常に動的で一貫性のないxml / jsonを使用する最良の方法

データを動的または不整合と呼ぶかどうかはわかりません。しかし、私はxmlまたはjsonから生成された人々のプロファイルページを作成する必要があります。問題は、返されるデータにあります。データは個人に関する書誌データであり、それを返すAPIは11年前のものです。彼らは再訪する必要があります。

データは次のようになります

    <person>
         <personalinfo>
              //Always the same......
         </personalinfo>
         <categories>
             <publications>
                 <item> //<---The issues lie inside here.
                      <authors>
                      </authors>
                      <publications>
                      </publications>
                 </item>
             </publications>
         </categories>
    </person>

問題は、カテゴリとアイテム情報にあります。新しいカテゴリはいつでも追加でき、何でも呼び出すことができます。また、アイテムは任意のフィールドを持つことができ、それらのフィールドは任意の名前を持つことができ、いつでも追加できます。基本的に、何が返ってくるのかわかりません。その上、情報の表示に関するヒントを提供するトークンは返されません。また、これらのAPIが返すフィードに入力されるデータのフォーマット要件もありません。

これらのAPIを更新する必要があることは承知していますが、現時点では検討されていません。期限を2週間延期したところ、プロフィールページをすぐに完成させる必要があります。

この混乱した情報を処理できる優れたツールはありますか?これをすばやく行うための提案はありますか?これは私が想像する反復的なプロジェクトになるので、私が使用するものはすべて暫定的な解決策になる可能性が高いです。返されるデータはjsonでもかまいませんが、同じ構造を保持しています。

これらのページを作成しているサイトは、.net MVCサイトです。私は他のすべてにかみそりを使用していますが、この特定のページにはもっと良いアプローチがあると思います。

私が懸念しているのは、データの解析ではありません。多くのライブラリで動的オブジェクトを使用できることを知っています。問題は、データを取得したらフォーマットすることです。データをフォーマットするために使用する適切な識別子またはトークンはありません。これらの動的オブジェクトを使用すると、モデルをビューに渡す前にそれらをフォーマットする良い方法があります。または、すべての可能なケースを処理するために巨大なxslシートを作成する必要がありますか。項目に含めることができる2000以上の異なるフィールドがあり、さらにフィールドを追加できるため、そのようにしたくありません。

作成者のようなものは、カテゴリAPAとMLAのようなものに基づいて異なる方法でフォーマットし、日付形式と電話/メール形式をカテゴリに基づいて異なるようにするため、フォーマットは問題です。問題は、私のプロジェクトではなく、私が今は修正できないAPIから発生したものであり、彼らは私を聞いていません。 APIのバックエンドのデータ構造が設定されたとき、彼らは良いデータを許可したかったのですが、フォーマットや新しいフィールドを作成するための構造化されたガイドラインを設定していませんでした。

そのため、出版物には著者が含まれ、詩には著者が含まれ、記事には著者が含まれる場合があります。 1つのカテゴリの日付は、日付、開始日、終了日、または誕生日です。根本的な原因を修正しない限り、これに対する非常に洗練された解決策はないことに気づきました。APIに正しく取り組むことができるようになるまで、誰かが迅速で簡単な暫定的な解決策についてアドバイスを求めているだけでした。また、一部のスポットのフィールドを、カテゴリではなく隣接するフィールドに基づいて並べ替えてほしいとも言われています。

6
PieMaker

多くのカスタムフォーマッタを作成する必要があります。例として、彼は電話番号をフォーマットするためのいくつかのソリューションです:

https://stackoverflow.com/questions/188510/how-to-format-a-string-as-a-telephone-number-in-c-sharp

ご覧のとおり、テーマにはさまざまなバリエーションがあります。

タイプとカテゴリを渡してフォーマッタを返すファクトリアプローチを試すことができます。すべてのフォーマッターはIFormatのようなインターフェイスを継承します。いくつかの例:

var formatter = FormatFactory.Create(FormatType.Telephone, "CategoryX");
var formattedString = formatter.Format(phoneNumberFromJsonString);

var formatter = FormatFactory.Create(FormatType.Author, "APA");
var formattedString = formatter.Format(AuthorFromJsonString);

少なくとも、1つのフォーマッターがすべてのシナリオを処理するのではなく、フォーマットロジックに焦点を当てたままにすることができます。

1
Jon Raynor

答えを再入力するために、事前にExcusme。 @WinstonEwertが指摘したように、私は質問の主要な問題を無視しました。

コメントの要約:

  • データモデル(EAV)は正規化されていません。
  • データモデルにデータ形式が適用されていません。
  • その結果、XML/JSONも正規化されません。そのため、シリアル化後もデータはフォーマットされません。

これは一連の問題であり、完全に直面するため、チェーンの最後では対処できません。

ここで公開されているソリューション:フォーマッタ、XSL、正規表現など。緩和策のようです。しばらく立つかもしれませんが、やがて足りなくなります。

本当の問題はデータモデルにあります。あなたは開発者として、開発者に期待されることを実行しました。問題とリスクを通知するため。今あなたの手にはありません。

これは、システムの弱点に対処するためのリソースがない(またはする予定がある)場合は、最初に期待の管理をお勧めします。

無制限のリソース(時間とお金)があれば、すべてが可能です。しかし、私はあなたの会社がそれらの多くを持っていることを疑います。したがって、それらはある時点で柔軟でなければなりません。

公開されたアプローチのコストを測定し、技術的な負債が会社に次第に無限の作業(システムに新しい要素を追加できるため)をもたらし、近い将来にROIがなくなることを説明します。実際のシステムは効率が悪く、タスクを自動化したり、タスクをプログラムしたりしてメンテナンスが手頃な価格になるようにするのはほぼ不可能に見えます。

誰もがリスクについて警告を受け、同意したら、コーディングを開始できます。

2
Laiv

構造に頼ることはできないようです。代わりに、値に依存する必要があります。各キーワードに合わせて動作を調整するコマンドラインプロセッサのようなものを書くことをお勧めします。

手順:

  1. データベース内のすべての要素キーワードの一覧を取得します。おそらく、Fiddlerのログをキャプチャしながら、データを反復処理する単純なプログラムを作成できます。ログをワードプロセッサに投入し、ワードカウントを取得します。

  2. 特別な処理が必要なすべての単語を特定します。多すぎないことを願っています。

  3. プログラムで、Dictionary<String,Func<string, string>>をアセンブルします。特別なキーワードごとに1つのエントリがあります。辞書のキーはキーワードです。値は、文字列を受け入れて文字列を返す無名関数です。

  4. キーワードごとに特別な処理を実行できる機能を辞書に追加します。

  5. ページをフォーマットするには、XMLを取得し、XPathまたはLinq-Xmlを使用してその要素を反復処理します。要素ごとに、辞書で無名関数を検索して呼び出し、XMLノードの内容を渡します。

  6. 無名関数の結果を取得してページに配置します。

1
John Wu