3

現在、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... から) を除外

子ノードを集めるためのステートメントですが、うまく処理できません。もちろん、それは私が自分の論理から少し離れているからかもしれません。

回答にさらに情報が必要な場合は、お気軽にお問い合わせください。

前もって感謝します、

スティーブ

4

2 に答える 2

0

子孫はすべてのI子を取得します。の値をその子の値からFirstNode分離するのに役立ちます。prostatic:の値に戻り文字がありprostatic:、 で削除しましたTrim

XElement x = XElement.Parse(@"
<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>");
//
List<string> result = x
  .Descendants(@"I")
  .Select(i => i.FirstNode.ToString().Trim())
  .ToList();

これらのアスタリスクを入れるハックな方法を次に示します。これを改善する時間がありません。

List<string> result2 = x
  .Descendants(@"I")
  .Select(i =>
    new string(Enumerable.Repeat('*', i.Ancestors(@"I").Count()).ToArray())
    + i.FirstNode.ToString().Trim())
  .ToList();
于 2009-02-02T19:07:08.453 に答える