【发布时间】:2013-05-28 15:05:06
【问题描述】:
现在我将首先说这确实是一个任务。然而,在我遇到 Linq to XML 语法之前,我几乎完成了它。
我有 2 个类:轨道和 CD 现在作为分配的一部分,我创建了一个 cd,然后向它添加了一些轨道。在搜索了许多完美解释如何从 xml 到对象的教程之后,我似乎无法让它工作(对象到 xml)。
我目前有:
//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);
现在这就是我需要放入 XML 的对象的原因。 to XML 部分是:
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);
只需 1 cd,效果就很好(得到了我需要的结果!)。当我决定添加另一张 cd 时,它显示:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.Linq.dll
Duplicate Attribute (cd)
指向 XDocument。除了这不起作用之外,它感觉很愚蠢(来自 cds x2 中的 c),但无论我尝试什么,我似乎都无法阻止这种语法讨厌我:
(
from c in cds
select new XAttribute("artist",c.getArtist()),
select new XAttribute("name", c.getTitle()) //No not happening!
),
很高兴您能提供任何帮助!
【问题讨论】:
-
为什么不直接使用
XmlSerializer类,然后将结果解析为XDocument? -
@LukeHennerley 我没听说过,老师在展示这种结构。
-
这看起来是提出家庭作业问题的好方法。但您似乎错过了异常发生在哪一行?
-
@Sayse 我更新了问题以显示引发异常的行
-
尝试在嵌套选择上设置断点,看看是否可以将其缩小一点..
标签: c# xml linq linq-to-xml