我有xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LabelTypesCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance="xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LabelTypes>
<LabelType>
<Name>LabelTypeProduct</Name>
</LabelType>
<LabelType>
<Name>LabelTypeClient</Name>
</LabelType>
</LabelTypes>
</LabelTypesCollection>
和2个c#课程:
[Serializable]
[XmlRoot("LabelTypesCollection")]
public class LabelTypesCollection
{
private static string _labelTypesCollectionPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Path.Combine(Program.ProgramName, "LabelTypesCollection.xml"));
[XmlArray("LabelTypes", ElementName="LabelType")]
public List<LabelType> LabelTypes { get; set; }
public static LabelTypesCollection LoadAllLabelTypes()
{
FileInfo fi = new FileInfo(_labelTypesCollectionPath);
if (!fi.Exists)
{
Logger.WriteLog("Could not find size_types_collection.xml file.", new Exception("Could not find size_types_collection.xml file."));
return new LabelTypesCollection();
}
try
{
using (FileStream fs = fi.OpenRead())
{
XmlSerializer serializer = new XmlSerializer(typeof(LabelTypesCollection));
LabelTypesCollection labelTypesCollection = (LabelTypesCollection)serializer.Deserialize(fs);
return labelTypesCollection;
}
}
catch (Exception ex)
{
Logger.WriteLog("Error during loading LabelTypesCollection", ex);
return null;
}
}
}
[Serializable]
public class LabelType
{
[XmlElement("Name")]
public string Name { get; set; }
[XmlIgnore]
public string TranslatedName
{
get
{
string translated = Common.Resources.GetValue(Name);
return (translated == null) ? Name : translated;
}
}
}
当我打电话时:
LabelTypesCollection.LoadAllLabelTypes();
我获得带有空LabelTypes列表的LabelTypeCollection对象。没有任何错误或任何错误。有人能指出我的问题吗?
答案 0 :(得分:2)
这是一个建议。
编写一个小型测试程序,创建LabelTypesCollection
的实例,并在其中添加一些LabelType
个对象。
然后使用XmlSerializer
将对象写入文件,并查看您获得的Xml,以确保您的输入Xml处于正确的架构中。
也许你的某个Xml元素出了问题。
答案 1 :(得分:2)
更改此
[XmlArray("LabelTypes", ElementName="LabelType")]
到这个
[XmlArray]
ElementName
的{{1}}指定容器的元素名称,实际上是您在ctor的第一个参数中指定的名称!所以你所说的“这个类序列化为一个名为XmlArrayAttribute
的容器;实际上我没有等待我希望容器被命名为LabelTypes
”。命名参数将覆盖第一个未命名参数所示的内容。
事实上,由于您希望容器元素名为LabelType
,这实际上是成员调用的,因此您根本不需要指定它。
您可能一直在考虑LabelTypes
,它控制序列化集合的各个成员的名称 - 但您也不需要这样。
我通常的解决xml序列化程序的方法是手动构建对象,然后查看它们序列化到的xml。在这种情况下,使用您当前使用的代码生成xml,如下所示:
XmlArrayItemAttribute
这让我想到了错误的<?xml version="1.0" encoding="utf-16"?>
<LabelTypesCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LabelType>
<LabelType>
<Name>one</Name>
</LabelType>
<LabelType>
<Name>two</Name>
</LabelType>
</LabelType>
</LabelTypesCollection>
说明符。
请注意,您还不需要LabelType
上的XmlRoot
或LabelTypesCollection
上的XmlElement
,因为您只需指定xml序列化程序将会出现的内容无论如何。
答案 2 :(得分:0)
我真的认为你得到一个空列表,因为你的代码找不到xml文件。还尝试实例化您的列表。如果你有正确的xml路径。
public List<LabelType> LabelTypes = new List<LabelType>();