質問

コードに DataSet として読み込む必要がある .xml ファイルが与えられました (背景として、ファイルは DataSet C# と呼び出し dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), 、ただし、これは他の人によって行われました)。

.xml ファイルは次のような形式でした。

 <?xml version="1.0" standalone="yes"?>
 <NewDataSet>
  <Foo>
    <Bar>abcd</Bar>
    <Foo>efg</Foo>
  </Foo>
  <Foo>
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>
  </Foo>
</NewDataSet>

C# と .NET 2.0 を使用して、以下のコードを使用してファイルを読み込みました。

        DataSet ds = new DataSet();
        ds.ReadXml(file);

この後、ブレークポイントを使用する line ds.Tables[0] 次のようになります(適切にフォーマットできなかったアンダースコアの代わりにダッシュを使用しています)。

Bar     Foo-Id    Foo-Id-0
abcd     0         null
null     1         0
hijk     2         null
null     3         2

回避策を見つけて(多くの回避策があることは知っています)、.xmlを正常に読み取ることができましたが、その理由を理解したいのは何ですか ds.ReadXml(file) このように実行されるので、今後はこの問題を回避できるでしょう。ありがとう。

役に立ちましたか?

解決

これはあなたの場合は正しいようです 入れ子になった フータグ:

<NewDataSet>  
  <Foo>              <!-- Foo-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   <!-- Foo-Id: 1, Parent-Id: 0 -->
  </Foo>
  <Foo>              <!-- Foo-Id: 2 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   <!-- Foo-Id: 3, Parent-Id: 2 -->
  </Foo>
</NewDataSet>

したがって、これは結果では正しく 4 レコードになり、親子キーは「Foo-Id-0」になります。

試す:

<NewDataSet>  
  <Rec>              <!-- Rec-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   
  </Rec>
  <Rec>              <!-- Rec-Id: 1 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   
  </Rec>
</NewDataSet>

その結果は次のようになります。

Bar     Foo        Rec-Id
abcd    efg        0
hijk    lmn        1

他のヒント

これらは完全な答えではなく、私の観察です。

私の推測では (自分で再現するつもりはありませんが)、DataSet が階層構造をリレーショナル データ構造に「平坦化」しようとするときに、いくつかのことが起こっているのではないかと考えられます。

1) リレーショナル データベースの観点からデータを考える。コレクション内の各 Foo 要素を識別する明確な主キー フィールドがないため、DataSet はファイル内の序数位置を Foo-Id と呼ばれる自動生成フィールドとして自動的に使用します。

2) 実際には「Foo」という名前の要素が 2 つあるため、おそらく列「Foo-Id-0」に奇妙な名前が生成されたことを説明しています (列に一意の名前が自動生成されています。次のように考えることができると思います)。これは DataSet のフォールト トレラント動作として機能します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top