嵌套的XML反序列化为c#提供了空值

时间:2014-04-24 09:21:23

标签: c# xml deserialization

我已经搜索了很多找到解决方案,但毕竟不能提出解决方案。 所以我希望有人可以帮助我。

我有一个xml结构:

    <?xml version="1.0" encoding="utf-8" ?>
    <ReleaseNoteConfig>
      <ReleaseNoteProperties>
        <TemplateLocation>Path to the template location</TemplateLocation>
        <TemplateFileName>wordfile.docx</TemplateFileName>
        <OutLocation>Path to the outlocation</OutLocation>
        <ReleaseName>Stackoverflow</ReleaseName>
        <ChangeOrder>1234</ChangeOrder>
        <ChangesHeader>Change ID</ChangesHeader>
        <ProblemsHeader>Problem ID</ProblemsHeader>
        <Environment>Test</Environment>
      </ReleaseNoteProperties>
      <DocProperties>
        <AuthorReleaseNote>Vincent Verweij</AuthorReleaseNote>
        <CustomerResponsible>Customer name</CustomerResponsible>
        <PlannedTestInstallDate>-</PlannedTestInstallDate>
        <PlannedAccInstallDate>30/04/2014</PlannedAccInstallDate>
        <PlannedProdInstallDate>07/05/2014</PlannedProdInstallDate>
        <TestInstallDate>-</TestInstallDate>
        <AccInstallDate>-</AccInstallDate>
        <ProdInstallDate>-</ProdInstallDate>
        <TestInstaller>-</TestInstaller>
        <AccInstaller>-</AccInstaller>
        <ProdInstaller>-</ProdInstaller>
        <UrlProjectPortal>Url to project site</UrlProjectPortal>
      </DocProperties>
      <SpecialProperties>
        <Customer_x0020_Name>Customer company name</Customer_x0020_Name>
        <Customer_x0020_Reference>No reference</Customer_x0020_Reference>
        <Approval_x0020_Date>15/04/2014</Approval_x0020_Date>
        <MyFerranti_x0020_Reference>1234</MyFerranti_x0020_Reference>
        <Project_x0020_ID>Proj000001</Project_x0020_ID>
      </SpecialProperties>
    </ReleaseNoteConfig>

我使用在线生成器从我的XML创建json,然后使用json2csharp来获取我需要的类。所以最终它提出了这个c#代码:

    public class ReleaseNoteProperties
    {
        public string TemplateLocation { get; set; }
        public string TemplateFileName { get; set; }
        public string OutLocation { get; set; }
        public string ReleaseName { get; set; }
        public string ChangeOrder { get; set; }
        public string ChangesHeader { get; set; }
        public string ProblemsHeader { get; set; }
        public string Environment { get; set; }
    }

    public class DocProperties
    {
        public string AuthorReleaseNote { get; set; }
        public string CustomerResponsible { get; set; }
        public string PlannedTestInstallDate { get; set; }
        public string PlannedAccInstallDate { get; set; }
        public string PlannedProdInstallDate { get; set; }
        public string TestInstallDate { get; set; }
        public string AccInstallDate { get; set; }
        public string ProdInstallDate { get; set; }
        public string TestInstaller { get; set; }
        public string AccInstaller { get; set; }
        public string ProdInstaller { get; set; }
        public string UrlProjectPortal { get; set; }
    }

    public class SpecialProperties
    {
        public string Customer_x0020_Name { get; set; }
        public string Customer_x0020_Reference { get; set; }
        public string Approval_x0020_Date { get; set; }
        public string MyFerranti_x0020_Reference { get; set; }
        public string Project_x0020_ID { get; set; }
    }

    public class ReleaseNoteConfig
    {
        public ReleaseNoteProperties ReleaseNoteProperties { get; set; }
        public DocProperties DocProperties { get; set; }
        public SpecialProperties SpecialProperties { get; set; }
    }

此代码将读取我的XML文件并将XML反序列化为对象。

    public ReleaseNoteConfig ReadXmlToObject(string xmlPath)
    {
        StringReader stream = null;
        XmlTextReader reader = null;

        var xDocument = XDocument.Load(xmlPath);
        string xml = xDocument.ToString();

        try
        {
            // Serialise the object
            XmlSerializer serializer = new XmlSerializer(typeof(ReleaseNoteConfig));
            // Read the XML data
            stream = new StringReader(xml);
            // Create a reader
            reader = new XmlTextReader(stream);

            // Convert reader to an object
            return (ReleaseNoteConfig)serializer.Deserialize(reader);
        }
        catch
        {
            return null;
        }
        finally
        {
            if (stream != null) stream.Close();
            if (reader != null) reader.Close();
        }
    }

现在问题;当我在Visual Studio中调试时,我看到三个对象中的两个被填充。这是我从调试器中截取的屏幕截图: http://www.smartus.be/xmlProblem/debugger.png

如您所见,DocProperties和ReleaseNoteProperties已正确填充,但SpecialProperties具有所有空值。首先我认为它与下划线有关,但当我在DocProperties中的属性中添加下划线时,它也被正确填充。

我还尝试在XmlElement,XmlRoot等属性上面添加属性,但这也没有帮助。

我还仔细检查过拼写错误,但似乎没有...

希望你们能帮助我解决这个问题。

提前致谢。

文森特

2 个答案:

答案 0 :(得分:1)

将您的SpecialProperties课程更改为:

public class SpecialProperties
{
    [XmlElement("Customer Name")]
    public string CustomerName { get; set; }

    [XmlElement("Customer Reference")]
    public string CustomerReference { get; set; }

    [XmlElement("Approval Date")]
    public string ApprovalDate { get; set; }

    [XmlElement("MyFerranti Reference")]
    public string MyFerrantiReference { get; set; }

    [XmlElement("Project ID")]
    public string ProjectID { get; set; }
}

如果需要,您可以更改属性名称,重要部分是XmlElement属性。

答案 1 :(得分:0)

我检查了你的代码。 你可以删除&#34; Customer_x0020_Name&#34;中的下划线。 ?同时你需要更改类中的属性名称。 它会起作用。

这个建议会对你有帮助吗?

我检查了它..它的工作。

我不确定带有下划线的标签名称是否合法。

标记答案,如果它已经解决了你的问题