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;
        }   

c#中的数组,数据为XML

看看标签为//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,但是如果您添加更多信息,我可以更改它。