2008-09-09 2 views
6

데이터 세트로 코드에 읽어야하는 .xml 파일이있었습니다 (배경으로 파일은 DataSet을 C#로 만들고 dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema)을 호출하지만이 작업은 완료되었습니다.) 누군가에 의해).XML 파일을 C# DataSet으로 읽는 데 문제가 발생했습니다.

.XML 파일이 모양 :이 후 중단 점을 사용

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

:

<?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을 사용하여, 나는 아래의 코드를 사용하여 파일을 읽을 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)이 이런 방식으로 수행 된 이유를 이해하고 싶습니다. 그래서이 문제를 피할 수있을 것입니다. 미래. 감사. (그것을 자신을 다시 생산하기 위해 노력없이)

내 생각 엔 데이터 집합이 계층 구조를 '평평'시도로 몇 가지가 발생 될 수있다 :

답변

4

이 당신의 중첩 푸 태그에 대한 올바른 것으로 보인다 :

<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 개 기록된다을의 부모 - 자식 키 "푸-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 
0

이 내 관찰보다는 전체 대답은 관계형 데이터 구조로 변환합니다.

1) 관계형 데이터베이스 관점에서 데이터에 대해 생각하는 것; 콜렉션의 각 Foo 요소를 식별하기위한 명백한 기본 키 필드가 없으므로 DataSet이 Foo-Id라는 자동 생성 필드로 파일의 서수 위치를 자동으로 사용했습니다.

2) 실제로 'Foo'라는 두 개의 요소가있어 'Foo-Id-0'열에 이상한 이름이 생성되는 것을 설명합니다 (열의 고유 한 이름을 자동 생성했습니다. 이것을 DataSet에서 내결함성있는 동작으로 생각할 수 있습니다.)

관련 문제