我想反序列化这个xml文件
<?xml version="1.0" encoding="utf-16"?>
<ti:document xmlns:ti="http://www.to-increase.com/data/document">
<Artikel>
<Artikelnr>030-0003</Artikelnr>
<Hoofd_EAN>2000003000036</Hoofd_EAN>
<Artikelomschrijving>Promo Transformers Goodie</Artikelomschrijving>
<Artikelomschrijving_lang>Promo Transformers Goodiebag Poster+Wobbler </Artikelomschrijving_lang>
<Gewicht>0</Gewicht>
<Lengte>0</Lengte>
<Breedte>0</Breedte>
<Hoogte>0</Hoogte>
<Extra_EAN_codes>
<Extra_EAN_code>2000003000036</Extra_EAN_code>
</Extra_EAN_codes>
</Artikel>
<Artikel>
<Artikelnr>030-0006</Artikelnr>
<Hoofd_EAN>2000003000067</Hoofd_EAN>
<Artikelomschrijving>Promo 2e Spel 50% Actie</Artikelomschrijving>
<Artikelomschrijving_lang>Promo 2e Spel 50% Actie </Artikelomschrijving_lang>
<Gewicht>0</Gewicht>
<Lengte>0</Lengte>
<Breedte>0</Breedte>
<Hoogte>0</Hoogte>
<Extra_EAN_codes>
<Extra_EAN_code>2000003000067</Extra_EAN_code>
</Extra_EAN_codes>
</Artikel>
<Artikel>
<Artikelnr>030-0007</Artikelnr>
<Hoofd_EAN>2000003000074</Hoofd_EAN>
<Artikelomschrijving>Promo Lego Spaaractie Kop</Artikelomschrijving>
<Artikelomschrijving_lang>Promo Lego Spaaractie Kopkaart </Artikelomschrijving_lang>
<Gewicht>80</Gewicht>
<Lengte>103</Lengte>
<Breedte>73</Breedte>
<Hoogte>1</Hoogte>
<Extra_EAN_codes>
<Extra_EAN_code>2000003000074</Extra_EAN_code>
</Extra_EAN_codes>
</Artikel>
</ti:document>
这是将xml反序列化为Artikels对象的代码。
[Serializable]
[XmlRootAttribute(Namespace = "http://www.to-increase.com/data/document", ElementName = "document")]
public class Artikels
{
public Artikels()
{
Artikelen = new List<Artikel>();
}
[XmlElement("Artikel")]
public List<Artikel> Artikelen { get; set; }
private static XmlSerializer _serializer;
private static XmlSerializer Serializer
{
get
{
if ((_serializer == null))
{
_serializer = new XmlSerializer(typeof(Artikels));
}
return _serializer;
}
}
/// <summary>
/// Deserializes workflow markup into an orders object
/// </summary>
/// <param name="xml">string workflow markup to deserialize</param>
/// <param name="obj">Output orders object</param>
/// <param name="exception">output Exception value if deserialize failed</param>
/// <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns>
public static bool Deserialize(string xml, out Artikels obj, out Exception exception)
{
exception = null;
obj = default(Artikels);
try
{
obj = Deserialize(xml);
return true;
}
catch (Exception ex)
{
exception = ex;
return false;
}
}
public static bool Deserialize(string xml, out Artikels obj)
{
Exception exception;
return Deserialize(xml, out obj, out exception);
}
public static Artikels Deserialize(string xml)
{
using (var sr = new StringReader(xml))
{
return ((Artikels)(Serializer.Deserialize(XmlReader.Create(sr))));
}
}
/// <summary>
/// Deserializes xml markup from file into an orders object
/// </summary>
/// <param name="fileName">string xml file to load and deserialize</param>
/// <param name="obj">Output orders object</param>
/// <param name="exception">output Exception value if deserialize failed</param>
/// <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns>
public static bool LoadFromFile(string fileName, out Artikels obj, out Exception exception)
{
exception = null;
obj = default(Artikels);
try
{
obj = LoadFromFile(fileName);
return true;
}
catch (Exception ex)
{
exception = ex;
return false;
}
}
public static bool LoadFromFile(string fileName, out Artikels obj)
{
Exception exception;
return LoadFromFile(fileName, out obj, out exception);
}
public static Artikels LoadFromFile(string fileName)
{
string xmlString;
using (var file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (var sr = new StreamReader(file))
{
xmlString = sr.ReadToEnd();
}
}
if (!string.IsNullOrEmpty(xmlString))
{
return Deserialize(xmlString);
}
return null;
}
}
[Serializable]
public class Artikel
{
public string Artikelnr { get; set; }
public string Hoofd_EAN { get; set; }
public string Artikelomschrijving { get; set; }
public string Artikelomschrijving_lang { get; set; }
public int Gewicht { get; set; }
public int Lenghte { get; set; }
public int Breedte { get; set; }
public int Hoogte { get; set; }
[XmlArrayItem("Extra_EAN_code", IsNullable = true)]
public List<string> Extra_EAN_codes { get; set; }
}
调用功能
Artikels artikelen;
Exception ex;
if (!Artikels.LoadFromFile(filePath, out artikelen, out ex))
{
ProcessError(errorDir, filePath, fileName, ex.Message);
continue;
}
代码运行正常,但Artikelen列表保持空白。如果我删除namespace属性并将xml文件更改为<document>
作为根元素,则所有内容都按预期反序列化。如何使用命名空间?
答案 0 :(得分:4)
在您的XML中,document
元素位于"http://www.to-increase.com/data/document"
名称空间中,前缀为ti
,但子Artikel
元素不在任何名称空间中。因此,您需要按如下方式装饰Artikelen
属性:
[XmlElement("Artikel", Namespace="")]
public List<Artikel> Artikelen { get; set; }
(如果根元素的默认命名空间为xmlns="http://www.to-increase.com/data/document"
,则子元素将位于该命名空间中。但是,没有默认命名空间,只有命名的ti
命名空间。)< / p>