1

私が持っている Xml ドキュメントを逆シリアル化するのに問題があります。以下のドキュメントの小さな完全なサンプルを参照してください。

<?xml version="1.0" encoding="utf-8" ?>
<MailClient>
<Client Id="Outlook.com">
    <Property Supported="false" Category="Responsive" Name="@media"><![CDATA["@media"]]></Property>
    <Property Supported="false" Category="Selectors" Name="*"><![CDATA["*"]]></Property>
    <Property Supported="false" Category="Selectors" Name="ElementSelector"><![CDATA["E"]]></Property>
    <Property Supported="false" Category="Selectors" Name="[=]"><![CDATA["[=]"]]></Property>
    <Property Supported="false" Category="Selectors" Name="[~=]"><![CDATA["[~=]"]]></Property>
    <Property Supported="false" Category="Selectors" Name="[^=]"><![CDATA["[^=]"]]></Property>
    <Property Supported="false" Category="Selectors" Name="[$=]"><![CDATA["[$=]"]]></Property>
    <Property Supported="false" Category="Selectors" Name="[*=]"><![CDATA["[*=]"]]></Property>
</Client>
</MailClient>

関連するクラスは次のようになります。

[Serializable, XmlRoot("Client"), XmlType("Client")]
public class MailClient
{
    [XmlElement("Client")]
    public List<CssRule> CssRules { get; set; }

    public MailClient()
    {
        CssRules = new List<CssRule>();
    }
}

[XmlType("Property")]
public class CssRule
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlAttribute("Category")]
    public string Category { get; set; }
    [XmlAttribute("Supported")]
    public bool IsSupported{ get; set; }

    public CssRule(){}
}

そして、デシリアライズは次のように行われます:

XmlSerializer serializer = new XmlSerializer(typeof(MailClient));
FileStream xmlFile = new FileStream(ConfigFile, FileMode.Open);
MailClient clients = (MailClient)serializer.Deserialize(xmlFile);

There is an error in XML document (2, 2).要素に関連する例外が発生していましたMailClient: {"<MailClient xmlns=''> was not expected."}。そこで、xml ルート属性を渡しました。

XmlSerializer serializer = new XmlSerializer(typeof(MailClient), 
new XmlRootAttribute("MailClient"));

これで問題が解決したようです。clients現在、単一のプロパティが含まれていますが、どのclientプロパティも入力されていません。つまりcategorynameなど...すべて空のままです。

ここでどこが間違っているのか誰にもわかりますか?この時点で、これを逆シリアル化するよりも、Linq to Xml を使用する方が速いのではないかと考え始めています。

4

1 に答える 1

2

あなたのMailClientクラスには、XmlRoot("Client"). それを実際のルート要素名、具体的には に変更しXmlRoot("MailClient")ます。XmlRootAttributeそうすれば、 in コードを使用する必要はありません。

コレクションの場合、XmlArrayおよびXmlArrayItem属性を使用する必要があります。

また、属性を使用している場合は、 XmlElementXmlType属性を使用する必要があります。

于 2013-09-30T14:55:53.010 に答える