2008-09-09 36 views
6

Tôi đã nhận tệp .xml mà tôi cần đọc vào mã của mình làm Số liệu (dưới dạng nền, tệp được tạo bằng cách tạo DataSet trong C# và gọi dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), nhưng điều này đã được thực hiện bởi người khác).Vấn đề đọc tệp XML thành C# Số liệu

Các tập tin .xml được hình như thế này:

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

Sử dụng C# và .NET 2.0, tôi đọc các tập tin trong việc sử dụng mã bên dưới:

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

Sử dụng một breakpoint, sau này line ds.Tables[0] trông như thế này (sử dụng dấu gạch ngang thay cho dấu gạch dưới mà tôi không thể định dạng đúng):

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

Tôi đã tìm được cách giải quyết (tôi biết có rất nhiều) và đã có thể đọc thành công trong .xml, nhưng tôi muốn hiểu tại sao ds.ReadXml(file) được thực hiện theo cách này, vì vậy tôi sẽ có thể tránh được sự cố trong Tương lai. Cảm ơn.

Trả lời

4

này dường như là chính xác cho lồng nhau thẻ Foo của bạn:

<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> 

Vì vậy, đây sẽ trở thành một cách chính xác 4 bản ghi trong kết quả của bạn, với một chìa khóa cha-con của "Foo-Id-0"

Hãy thử:

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

nào nên kết quả trong:

Bar  Foo  Rec-Id 
abcd efg  0 
hijk lmn  1 
0

Đây là những quan sát của tôi chứ không phải là một câu trả lời đầy đủ:

tôi đoán (không cố gắng để tái sản xuất ra nó bản thân mình) được rằng một vài điều có thể xảy ra như DataSet cố gắng 'san bằng' một cấu trúc phân cấp đến một cấu trúc dữ liệu quan hệ.

1) suy nghĩ về dữ liệu từ phối cảnh cơ sở dữ liệu quan hệ; không có trường khóa chính rõ ràng nào để xác định từng phần tử Foo trong tập hợp sao cho Số liệu đã tự động sử dụng vị trí thứ tự trong tệp dưới dạng trường được tạo tự động được gọi là Foo-Id.

2) Thực tế có hai yếu tố được gọi là 'Foo' để có thể giải thích việc tạo tên lạ cho cột 'Foo-Id-0' (nó tự động tạo tên duy nhất cho cột - tôi đoán bạn có thể nghĩ đây là một hành vi chịu lỗi trong DataSet).

Các vấn đề liên quan