【发布时间】:2012-04-10 11:35:48
【问题描述】:
我想导入 XML 文件中的测验问题。 XML中有问题列表,每个问题都有一个答案列表。有人可以帮助我并告诉我哪里错了吗?
XML 文件“pitanja.xml”:
<?xml version="1.0" encoding="utf-8"?>
<Pitanja>
<Pitanje>
<TekstPitanja>
U kojoj državi se nalazi Ajfelova kula?
</TekstPitanja>
<Odgovori>
<Odgovor tacan = "true" > Francuska </Odgovor>
<Odgovor> Nemačka </Odgovor>
<Odgovor> Španija </Odgovor>
<Odgovor> Italija </Odgovor>
</Odgovori>
</Pitanje>
<Pitanje>
<TekstPitanja>
U kom gradu se nalazi Big Ben?
</TekstPitanja>
<Odgovori>
<Odgovor tacan = "true" > London </Odgovor>
<Odgovor> Pariz </Odgovor>
<Odgovor> Lisabon </Odgovor>
<Odgovor> Madrid </Odgovor>
</Odgovori>
</Pitanje>
<Pitanje>
<TekstPitanja>
Glavni grad Španije je?
</TekstPitanja>
<Odgovori>
<Odgovor tacan = "true" > Madrid </Odgovor>
<Odgovor> Barselona </Odgovor>
<Odgovor> Lisabon </Odgovor>
<Odgovor> Rim </Odgovor>
</Odgovori>
</Pitanje>
</Pitanja>
C#代码:
[XmlRoot("Pitanja")]
public class Pitanja
{
[XmlArray("Pitanja")]
[XmlArrayItem("Pitanje")]
public List<Pitanje> SvaPitanja { get; set; }
}
public class Pitanje
{
[XmlElement("TekstPitanja")]
public string TekstPitanja { get; set; } // Tekst pitanja
[XmlArray("Odgovori")]
[XmlArrayItem("Odgovor")]
public List<Odgovor> Odgovori { get; set; } // Niz odgovora na pitanje
}
public class Odgovor
{
[XmlText]
public string odgovor { get; set; }
[XmlAttribute]
public Boolean tacan { get; set; }
}
public void ucitajpitanja()
{
XmlSerializer dsr = new XmlSerializer(typeof(Pitanja));
using (System.IO.StreamReader str = new System.IO.StreamReader(@"C:\pitanja.xml"))
{
pitanja = (Pitanja)dsr.Deserialize(str);
}
}
【问题讨论】:
-
XmlSerializer 正在寻找(例如)
<ArrayOfOdgovor><Odgovor /><Odgovor /></ArrayOfOdgovor>。它会将<ArrayOfFoo />反序列化为Foo[]数组或List<Foo>。但我不知道在源代码中没有ArrayOfFoo元素的情况下如何让它做到这一点。 -
我编辑了一个 XML 文档,但程序仍然无法运行。
-
嗨 Zoran,我怀疑您需要用
[XmlText]属性装饰Odgovor.odgovor属性。 -
我添加了 [XmlElement("Odgovor")],但程序仍然无法运行 :(
-
当您使用
[XmlElement("Odgovor")]装饰 odgovor 属性时,您是在告诉序列化程序 Odgovor 元素包含一个字符串类型的 Odgovor 元素,即:<Odgovori><Odgovor tacan = "true"><Odgovor>Madrid</Odgovor></Odgovor></Odgovori>。使用[XmlText]表示odgovor属性对应<Odgovor>元素的Text内容;这将匹配您的示例 XML 数据。
标签: c# xml xml-deserialization