设置
我的Main()
功能中有这个。
List<Token> tokens = new List<Token>();
string path = @"\(some directories)\tokens.xml";
XDocument doc = XDocument.Load(path);
我有这个类有一些属性。
public partial class Token
{
public Token()
{
SetURLs = new List<string>();
SetNames = new List<string>();
}
public string Name { get; set; }
public List<string> SetURLs { get; set; }
public List<string> SetNames { get; set; }
public string Color { get; set; }
public string PT { get; set; }
public string Text { get; set; }
}
我有这个 XML 文件。这是一个片段。
<?xml version="1.0" encoding="UTF-8"?> //EDIT3
<card_database version="2"> //EDIT3
<cards>
.
.
.
<card>
<name>Griffin</name>
<set picURL="http://magiccards.info/extras/token/duel-decks-ajani-vs-nicol-bolas/griffin.jpg" picURLHq="" picURLSt="">DDH</set>
<color>w</color>
<manacost></manacost>
<type>Token</type>
<pt>2/2</pt>
<tablerow>0</tablerow>
<text>Flying</text>
<token>1</token>
</card>
<card>
<name>Rat</name>
<set picURL="http://magiccards.info/extras/token/shadowmoor/rat.jpg" picURLHq="" picURLSt="">SHM</set>
<set picURL="http://magiccards.info/extras/token/gatecrash/rat.jpg" picURLHq="" picURLSt="">GTC</set>
<color>b</color>
<manacost></manacost>
<type>Token</type>
<pt>1/1</pt>
<tablerow>0</tablerow>
<text></text>
<token>1</token>
</card>
.
.
.
</cards>
</card_database> //EDIT3
如您所见,根元素<card>
中有许多元素。<cards>
此外,每个都<card>
可以有许多<set>
元素。我相应地上课了。
问题
如何一次完成一个<card>
并为每个属性分配适当的值?
我试过的
我制作了一个列表,其中包含<name>
每个<card>
. 然后,我将浏览此列表并为Token
类Name
属性的新实例分配一个名称。tokens
然后用每个新实例填充我的列表。
List<string> names = new List<string>();
names = doc.Descendants("card").Elements("name").Select(r => r.Value).ToList();
int amount = doc.Descendants("card").Count();
for(int i = 0; i < amount; i++)
{
Token token = new Token();
token.Name = name[i];
.
.
.
tokens.Add(token);
}
我想我可以制作更多包含所有其他所需元素的列表并执行相同的过程,但必须有更优雅的方式,对吧?
编辑
我还尝试了另一个问题的序列化。但是由于某种原因,当我尝试从token
控制台写一些东西(比如 token.Name)时,它什么也没写。
XmlSerializer serializer = new XmlSerializer(typeof(Token));
using (StringReader reader = new StringReader(path))
{
Token token = (Token)(serializer.Deserialize(reader));
}
可能只是一个不正确的实现。如果是这样的话,有人可以使用我发布的内容并向我展示正确的实现吗?另外,我假设这会给我的两个List
属性提供 1 个或多个值,对吗?
编辑
谢谢您的帮助。
编辑2
一个答案
在对序列化和更多搜索进行了一些不成功的摆弄之后,我做了一个有效的实现。
foreach (var card in doc.Descendants("card"))
{
Token token = new Token();
token.Name = card.Element("name").Value.ToString();
foreach (var set in card.Elements("set"))
{
token.SetURLs.Add(set.Attribute("picURL").Value.ToString());
token.SetNames.Add(set.Value.ToString());
}
token.Color = card.Element("color").Value.ToString();
token.PT = card.Element("pt").Value.ToString();
token.Text = card.Element("text").Value.ToString();
tokens.Add(token);
}
比Lists
我最初想象的数字要好得多。不像序列化那样简洁。但是,它可以满足我的需要。
谢谢您的帮助。
编辑4
不确定是允许这么多编辑还是违反礼仪。只是想为未来的读者做这个编辑。
“答案”部分下的内容确实解决了我的问题,但 Dave 在下面发布的 XML 序列化要好得多;它更灵活,更容易重用/修改。因此,请选择对您的情况有更多好处的解决方案。