在反序列化xml c#期间更改元素的名称

时间:2017-06-02 19:57:20

标签: c# xml xml-deserialization xmltype typename

我有一个看起来像这样的课程:

[XmlType(TypeName = "rootType")]
public class myClass
{
    public Class1 class1;
    public Class2 class2;

    [XmlType(TypeName = "type1")]
    public class class1
    { ... class1 definition ...}
    [XmlType(TypeName = "type2")]
    public class class2
    { ... class1 definition ...}    

}

当我序列化它时,生成的xml将是

<rootType>
    <class1>
       ... some stuff
    <class1/>
    <class2>
       ... some stuff
    <class2/>
<rootType/>

但是,我的问题是这些xmltype装饰刚刚添加到类中,这意味着在以前的版本(客户端使用)中,xml看起来像

<myClass>
    <type1>
       ... some stuff
    <type1/>
    <type2>
       ... some stuff
    <type2/>
<myClass/>

有没有办法可以控制反序列化过程(或任何其他解决此问题的方法),如果可能的话,并且能够使用这些XmlType装饰将此xml反序列化为myClass?

1 个答案:

答案 0 :(得分:0)

你的问题已经彻底解决了。

首先,在创建序列化程序时,添加具有所需名称的var serializer = new XmlSerializer(typeof(myClass), new XmlRootAttribute("myClass")); serializer.UnknownElement += Serializer_UnknownElement; 参数。

其次,将事件处理程序添加到序列化程序。

void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
    myClass my = (myClass)e.ObjectBeingDeserialized;

    if (e.Element.Name == "type1")
    {
        var ser = new XmlSerializer(typeof(myClass.Class1));
        using (var sr = new StringReader(e.Element.OuterXml))
            my.class1 = (myClass.Class1)ser.Deserialize(sr);
    }
    else if (e.Element.Name == "type2")
    {
        var ser = new XmlSerializer(typeof(myClass.Class2));
        using (var sr = new StringReader(e.Element.OuterXml))
            my.class2 = (myClass.Class2)ser.Deserialize(sr);
    }
}

事件处理程序应如下所示:

myClass my;
using (var fs = new FileStream("test.xml", FileMode.Open))
    my = (myClass)serializer.Deserialize(fs);

一如既往地使用:

def convert(userInput):
    english = userInput.getText()
    obish = 'ob'
    if len(original) > 0 and original.isalpha():
        word = english.lower()
        x = word[0]
        if x == "a" or x == "e" or x == "i" or x == "o" or x == "u":
            obWord = word + ob
            print (obWord)
        else:
            print ('')
    else:
        print ('empty')

它应该有用。

相关问题