Bây giờ tôi sẽ bắt đầu bằng cách nói điều này thực sự là một sự đảm bảo. Tuy nhiên, tôi đã gần hoàn thành nó cho đến khi tôi chạy vào cú pháp LINQ to XML.LINQ to XML - Cách sử dụng XDocument đúng cách
Tôi có 2 lớp: Theo dõi và CD bây giờ là một phần của phần đảm bảo, tôi tạo đĩa CD và sau đó thêm một số bản nhạc vào đó. Sau khi tìm kiếm rất nhiều hướng dẫn đã giải thích hoàn hảo cách đi từ xml đến các đối tượng, tôi dường như không thể làm việc này (đối tượng với xml).
Tôi hiện có:
//My list of cds
List<CD> cds = new List<CD>();
//Make a new CD and add some tracks to it
CD c1 = new CD("Awake","Dream Theater");
Track t1 = new Track("6:00", "Dream Theater", new TimeSpan(00, 05, 31));
Track t2 = new Track("Caught in a Web", "Dream Theater", new TimeSpan(00, 05, 28));
Track t3 = new Track("Innocence Faded", "Dream Theater", new TimeSpan(00, 05, 34));
c1.addTrack(t1);
c1.addTrack(t2);
c1.addTrack(t3);
cds.Add(c1);
//Make another cd and add it
CD c2 = new CD("Second cd","TestArtist");
Track t4 = new Track("TrackForSecond","TestArtist",new TimeSpan(00,13,37));
c2.addTrack(t4);
cds.add(c2);
Bây giờ đây là những gì được cho tôi những đồ vật tôi cần phải đưa vào XML. Phần XML là:
XDocument xmlOutput = new XDocument (
new XDeclaration("1.0","utf-8","yes"),
(from cl in cds orderby cl.getArtist()
select new XElement("cd", /*From new to the end of this is the error*/
(
from c in cds
select new XAttribute("artist",c.getArtist())
),
(
from c in cds
select new XAttribute("name", c.getTitle())
),
new XElement("tracks",
(
from t in c1.getTracks()
select new XElement("track",
new XElement("artist",t1.getArtist()),
new XElement("title",t1.getTitle()),
new XElement("length",t1.getLength())
)
)
)
)
)
);
Console.WriteLine(xmlOutput);
Điều này làm việc tuyệt vời (cho tôi kết quả tôi cần!) Chỉ với 1 cd. Khi tôi quyết định thêm một đĩa CD khác, nó hiển thị:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.Linq.dll
Duplicate Attribute (cd)
Chỉ trỏ vào XDocument. Ngoài này không làm việc nó cảm thấy khá ngu ngốc (từ c trong CD x2) nhưng bất cứ điều gì tôi cố gắng tôi dường như không thể ngăn chặn cú pháp này từ ghét tôi:
(
from c in cds
select new XAttribute("artist",c.getArtist()),
select new XAttribute("name", c.getTitle()) //No not happening!
),
Sẽ rất hài lòng với bất kỳ giúp bạn có thể cung cấp!
Tại sao bạn không chỉ sử dụng lớp 'XmlSerializer' và sau đó phân tích kết quả thành' XDocument'? – LukeHennerley
@LukeHennerley Tôi chưa từng nghe về nó, giáo viên đang trưng bày những loại cấu trúc này. –
Điều này có vẻ là một cách hay để hỏi một câu hỏi về bài tập về nhà .. dường như bạn đã bỏ lỡ những gì mà ngoại lệ xảy ra? – Sayse