現在、Silverlight アプリに取り組んでおり、XML データを適切なオブジェクトに変換してデータをバインドする必要があります。この説明の基本的なクラス定義は次のとおりです。
public class TabularEntry
{
public string Tag { get; set; }
public string Description { get; set; }
public string Code { get; set; }
public string UseNote { get; set; }
public List<string> Excludes { get; set; }
public List<string> Includes { get; set; }
public List<string> Synonyms { get; set; }
public string Flags { get; set; }
public List<TabularEntry> SubEntries { get; set; }
}
このオブジェクトにフィードする XML の例を次に示します。
<I4 Ref="1">222.2
<DX>Prostate</DX>
<EX>
<I>adenomatous hyperplasia of prostate (600.20-600.21)</I>
<I>prostatic:
<I>adenoma (600.20-600.21)</I>
<I>enlargement (600.00-600.01)</I>
<I>hypertrophy (600.00-600.01)</I>
</I>
</EX>
<FL>M</FL>
</I4>
そのため、さまざまなノードが特定のプロパティにマップされます。この質問の鍵となるのはノード<EX>
と<I>
ノードです。<EX>
ノードには 1 つ以上のノードのコレクションが含まれ<I>
、この例では、上記のクラス定義の「除外」プロパティに一致します。
ここに挑戦が来ます(私にとって)。この XML を発行する Web サービスを制御できないため、変更することはできません。この例では、1 つ<I>
のノードに 1 つ以上の<I>
ノードの別のコレクションも含まれていることがわかります。LINQ to XML クエリを使用して、両方のレベルを 1 つのコレクションに統合し、下位レベルの項目を区切る文字を使用できるようにしたいと考えています。この例では、LINQ クエリが TablularEntry を返したときにオブジェクトの場合、次のように表示される Exclude アイテムのコレクションが含まれます。
- 前立腺の腺腫性過形成 (600.20-600.21)
- 前立腺:
- *腺腫 (600.20-600.21)
- ※拡大(600.00~600.01)
- *肥大 (600.00-600.01)
したがって、XML では、最後の 3 つのエントリは実際には 2 番目のエントリの子オブジェクトですが、オブジェクトの Excludes プロパティでは、それらはすべて同じコレクションの一部であり、前の子オブジェクトには識別子文字/文字列が含まれています。
以下で使用しているLINQクエリの始まりがありますが、子オブジェクトを統合するビットがよくわかりません。現在存在するコードは次のとおりです。
List<TabularEntry> GetTabularEntries(XElement source)
{
List<TabularEntry> result;
result = (from tabularentry in source.Elements()
select new TabularEntry()
{
Tag = tabularentry.Name.ToString(),
Description = tabularentry.Element("DX").ToString(),
Code = tabularentry.FirstNode.ToString(),
UseNote = tabularentry.Element("UN") == null ? null : tabularentry.Element("UN").Value,
Excludes = (from i in tabularentry.Element("EX").Elements("I")
select i.Value).ToList()
}).ToList();
return result;
}
FROMステートメントをネストする必要があると考えています
= (i... から) を除外
子ノードを集めるためのステートメントですが、うまく処理できません。もちろん、それは私が自分の論理から少し離れているからかもしれません。
回答にさらに情報が必要な場合は、お気軽にお問い合わせください。
前もって感謝します、
スティーブ