XML 파일을 C# DataSet으로 읽는 문제
문제
내 코드를 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>
따라서 이는 "Foo-Id-0"의 상위-하위 키를 사용하여 결과에 올바르게 4개의 레코드가 됩니다.
노력하다:
<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'라는 두 요소가 있으므로 'Foo-Id-0' 열에 이상한 이름이 생성된 이유를 설명할 수 있습니다(열에 대한 고유한 이름이 자동 생성되었습니다. 이는 DataSet의 내결함성 동작입니다.