繁体   English   中英

C#使用名称空间反序列化xml

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM