C# 按命名空间的XmlSerializer筛选器

C# 按命名空间的XmlSerializer筛选器,c#,xml-serialization,xml-deserialization,C#,Xml Serialization,Xml Deserialization,我正在尝试反序列化一个RSS2.0提要,我想考虑一些iTunes扩展,但不必将它们直接烘焙到主类中 使用C#中的XML反序列化程序,是否可以执行以下操作 public class RssChannel { [XmlElement("title")] public string Title { get; set; } [XmlElement("link")] public string Link { get; set; } .... [XmlE

我正在尝试反序列化一个RSS2.0提要,我想考虑一些iTunes扩展,但不必将它们直接烘焙到主类中

使用C#中的XML反序列化程序,是否可以执行以下操作

public class RssChannel
{
    [XmlElement("title")]
    public string Title { get; set; }

    [XmlElement("link")]
    public string Link { get; set; }

    ....

    [XmlElement(Namespace = "itunes")]
    public iTunesExtensions iTunes { get; set; }
}

public class iTunesExtensions 
{
    [XmlElement("category")]
    public string[] Categories { get; set; }
}
我希望它能解析如下内容:

<channel>
    <itunes:category text="Society & Culture"/>
    <itunes:category text="Society & Culture"/>
    <itunes:category text="Society & Culture"/>
</channel>

有可能在模块化程度更高的地方做类似的事情吗?还是我被困在主课上烤它?

bizzehdee

要将第一个级别设置为“”,需要将其设置为类的根和名称:

[XmlRoot("channel")]
public class channel
对于以下示例,我将其保留为RssChannel

我假设你打算使用比iTunes更多的平台,所以iTunes仍然有自己的类。这样做的方法是使用列表而不是数组,代码更少:

public List<iTunes> iTunes;
使用这些方法的最佳方法是首先使用DeserializeData()方法获取RssChannel的实例,如:

RssChannel foo = StaticClassName.DeserializeData();
SaveData(ref foo);
对其进行更改,然后通过将该实例作为对SaveData()方法的引用传递来保存该实例,如:

RssChannel foo = StaticClassName.DeserializeData();
SaveData(ref foo);
下面是一个完整的工作示例:

public static class XML
{
    // Serializes the passed instance of RssChannel into XML file, and saves to runtime memory.
    public static void SaveData(ref RssChannel instance)
    {
        // Objects:
        StreamWriter sw = new StreamWriter("yourXmlFile.xml");
        XmlSerializer serializer = new XmlSerializer(typeof(RssChannel));

        // Save data.
        serializer.Serialize(sw, instance);
        sw.Close();
    }

    // Deserializes data from the XML file, and returns the instance.
    public static RssChannel DeserializeData()
    {
        // Objects:
        RssChannel channelData = new RssChannel();
        XmlSerializer serializer = new XmlSerializer(typeof(RssChannel));
        List<iTunes> iTunesList = new List<iTunes>();

        if (File.Exists("yourXmlFile.xml"))
        {
            FileStream stream = new FileStream("yourXmlFile.xml", FileMode.Open);

            // Deserialize data.
            channelData = (RssChannel)serializer.Deserialize(stream);
            stream.Close();

            // Add data from deserialized iTunes list to list instance.
            if (channelData.iTunesList != null)
                iTunesList = channelData.iTunesList;
        }

        // Add data to RootData object lists.
        channelData.iTunesList = iTunesList;

        return channelData;
    }
}

[XmlRoot("RssChannel")]
public class RssChannel
{
    [XmlAttribute("Title")]
    public string Title; // { get; set; }

    [XmlAttribute("Link")]
    public string Link; // { get; set; }

    public List<iTunes> iTunesList; // { get; set; }
}

public class iTunes 
{
    public List<Category> Categories; // { get; set; }
}

public class Category
{
    [XmlAttribute("category")]
    public string category; // { get; set; }
}
公共静态类XML
{
//将传递的RssChannel实例序列化为XML文件,并保存到运行时内存中。
公共静态void SaveData(ref RssChannel实例)
{
//对象:
StreamWriter sw=newstreamwriter(“yourXmlFile.xml”);
XmlSerializer serializer=新的XmlSerializer(typeof(RssChannel));
//保存数据。
serializer.Serialize(软件,实例);
sw.Close();
}
//反序列化XML文件中的数据,并返回实例。
公共静态RssChannel反序列化数据()
{
//对象:
RssChannel channelData=新的RssChannel();
XmlSerializer serializer=新的XmlSerializer(typeof(RssChannel));
列表iTunesList=新列表();
如果(File.Exists(“yourXmlFile.xml”))
{
FileStream=newfilestream(“yourXmlFile.xml”,FileMode.Open);
//反序列化数据。
channelData=(RssChannel)序列化程序。反序列化(流);
stream.Close();
//将反序列化iTunes列表中的数据添加到列表实例。
if(channelData.iTunesList!=null)
iTunesList=channelData.iTunesList;
}
//将数据添加到RootData对象列表。
channelData.iTunesList=iTunesList;
返回通道数据;
}
}
[XmlRoot(“RssChannel”)]
公共类RssChannel
{
[XmlAttribute(“标题”)]
公共字符串标题;//{get;set;}
[XmlAttribute(“链接”)]
公共字符串链接;//{get;set;}
公共列表iTunesList;//{get;set;}
}
公共级iTunes
{
公共列表类别;//{get;set;}
}
公共类类别
{
[XmlAttribute(“类别”)]
公共字符串类别;//{get;set;}
}
您可以像这样使用类和静态方法:

private void AnyMethod()
{
    // To get an instance of your RssChannel class with all the data:
    RssChannel rssChannel = XML.DeserializeData();

    // Do anything with the data. Example below:
    iTunes newITunes = new iTunes();
    List<Category> categoryList = new List<Category>();

    Category newCategory1 = new Category(); // Create new categories.
    newCategory1.category = "Allegro";
    categoryList.Add(newCategory1);

    Category newCategory2 = new Category();
    newCategory2.category = "Prestissimo";
    categoryList.Add(newCategory2);

    newITunes.Categories = categoryList; // Add the categories to list.

    rssChannel.iTunesList.Add(newITunes); // Add that list to iTunes list.

    // Now, to save the data, pass a reference to the instance we just worked on:
    XML.SaveData(ref rssChannel);
}
private void AnyMethod()
{
//要获取包含所有数据的RssChannel类的实例,请执行以下操作:
RssChannel RssChannel=XML.DeserializeData();
//对数据执行任何操作。示例如下:
iTunes newITunes=新iTunes();
List categoryList=新列表();
Category newCategory1=新类别();//创建新类别。
newCategory1.category=“Allegro”;
categoryList.Add(新类别1);
类别newCategory2=新类别();
newCategory2.category=“Prestissimo”;
categoryList.Add(新类别2);
newITunes.Categories=categoryList;//将类别添加到列表中。
rssChannel.iTunesList.Add(newITunes);//将该列表添加到iTunes列表中。
//现在,要保存数据,请传递对我们刚刚处理的实例的引用:
SaveData(参考rssChannel);
}
这将生成一个如下所示的文件:

<?xml version="1.0" encoding="utf-8"?>
<RssChannel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <iTunesList>
    <iTunes>
      <Categories>
        <Category category="Allegro" />
        <Category category="Prestissimo" />
      </Categories>
    </iTunes>
  </iTunesList>
</RssChannel>


为什么不创建一个单独的类RssItunesChannel,它继承了主类RssChannel。通过这种方式,您可以对包含此特定结构的rss源使用I tunes类。然后父级中需要iTunes类,而不是channel类,因此不妨将其烘焙到channel类中。No创建继承rsschannel的类并添加新属性。请参阅示例XML。它使用名称空间,而不是元素。另外,我不打算生成任何xml,我希望使用现有的RSS 2.0播客XMLbizzehdee,您可以使用我提供的概念并将其应用到您的环境中。您的主要问题是关于使用[XmlAttribute()]。我回答了这个问题,并且我生成的代码在与category元素相同的行中包含了category名称。