c#中的数组,数据为XML
本文关键字:数据 XML 数组 | 更新日期: 2023-09-27 17:49:24
我得到一个XML我想要得到角色的值在c#中创建一个数组,然后删除相同的值来创建另一个。XML在这里:
<Phrase Role="2"></Phrase>
<Phrase Role="2"></Phrase>
<Phrase Role="1"></Phrase>
<Phrase Role="1"></Phrase>
<Phrase Role="2"></Phrase>
<Phrase Role="1"></Phrase>
<Phrase Role="2"></Phrase>
这是我的启动,我得到所有的角色,但是当我把它们添加到一个数组中,它不显示角色的值,只是得到System.Int32[]。加载xml并转换为类代码在这里:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<Phrase Role="2"></Phrase>
<Phrase Role="2"></Phrase>
<Phrase Role="1"></Phrase>
<Phrase Role="1"></Phrase>
<Phrase Role="2"></Phrase>
<Phrase Role="1"></Phrase>
<Phrase Role="2"></Phrase>");
//get all the phrases
XmlNodeList phrases = xml.GetElementsByTagName("Phrase");
foreach (XmlNode phraseNode in phrases)
{
Phrase phrase = NodeToPhrase(phraseNode);
phrasesList.Add(phrase);
}
//Phrase node to phrase
private Phrase NodeToPhrase(XmlNode node)
{
Phrase phrase = new Phrase();
XmlNode roleNode = node.Attributes["Role"];
if (roleNode != null && !string.IsNullOrEmpty(roleNode.Value))
phrase.Role = roleNode.Value;
return phrase;
}
//Crate a phrase class
public Dictionary<string, Phrase> Phrases = new Dictionary<string, Phrase>();
public class Phrase
{
public string Role = null;
}
我的创建数组和删除相同的值代码在这里:
//Create Array
List<int> roleIntList = new List<int>();
foreach(var roles in Phrases){
var roleNode = roles.Value as Phrase;
int roleNum = int.Parse(roleNode.Role);
roleIntList.Add(roleNum);//this can't get value 2,1,1,2,1,2;;
int [] roleInt = roleIntList.Distinct().ToArray();//this not work;
}
看看标签为//Create Array的代码,看起来你可能想要移动这一行:
int [] roleInt = roleIntList.Distinct().ToArray();
放在foreach循环之外:
List<int> roleIntList = new List<int>();
foreach(var roles in Phrases){
var roleNode = roles.Value as Phrase;
int roleNum = int.Parse(roleNode.Role);
roleIntList.Add(roleNum);//this can't get value 2,1,1,2,1,2;;
}
int [] roleInt = roleIntList.Distinct().ToArray();//this not work;
首先,如果你打算使用XML API,那么LINQ to XML XDocument
远比破烂的XmlDocument
API好得多。
第二,如果你只是想把XML变成一个对象模型,那么XmlSerializer
就是你应该看的。与手动解析相比,您只需编写很少的代码:
[XmlRoot("Phrases")]
public class Phrases : List<Phrase>
{
}
public class Phrase
{
[XmlAttribute]
public int Role { get; set; }
}
反序列化XML:
var serializer = new XmlSerializer(typeof(Phrases));
using (var reader = new StringReader(xml))
{
var phrasesList = (Phrases)serializer.Deserialize(reader);
}
和得到你独特的角色:
var uniqueRoles = phrasesList.Select(p => p.Role).Distinct();
我假设您的XML有一个根节点(上面的代码会抛出异常,因为它没有)。对于示例,我使用Phrases
,但是如果您添加更多信息,我可以更改它。