我在对我拥有的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 root属性:
XmlSerializer serializer = new XmlSerializer(typeof(MailClient),
new XmlRootAttribute("MailClient"));
这似乎纠正了这个问题。 clients
现在只包含一个client
,但没有填充任何属性,也就是说category
,name
等等...都保持为空。
谁能看到我在这里出错的地方?在这一点上,我开始认为我可以更快地将Linq用于Xml而不是尝试反序列化
答案 0 :(得分:2)
在MailClient
课程中,您有XmlRoot("Client")
。将其更改为实际的根元素名称,特别是XmlRoot("MailClient")
。这样,您就不必在代码中使用XmlRootAttribute
。
对于馆藏,您应该使用XmlArray和XmlArrayItem属性。
使用XmlType
属性的位置,您应该使用XmlElement属性。