[英]C# deserialize xml with namespace
我想反序列化此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的列表保持空白。 如果我删除名称空间属性并将xml文件更改为<document>
作为根元素,则所有内容都会按预期反序列化。 我如何使其与命名空间一起使用?
在您的XML中, document
元素位于前缀为ti
的"http://www.to-increase.com/data/document"
命名空间中,但Artikel
子元素不在任何命名空间中。 因此,您需要如下装饰Artikelen
属性:
[XmlElement("Artikel", Namespace="")]
public List<Artikel> Artikelen { get; set; }
(如果根元素的默认名称空间为xmlns="http://www.to-increase.com/data/document"
,则子元素将位于该名称空间中。但是,没有默认的名称空间,只有命名的ti
名称空间。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.