C#用命名空间反序列化xml

时间:2015-07-23 18:13:33

标签: c# xml serialization

我想反序列化这个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>作为根元素,则所有内容都按预期反序列化。如何使用命名空间?

1 个答案:

答案 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>