对c#的嵌套XML反序列化提供了null值

本文关键字:null 反序列化 嵌套 XML | 更新日期: 2023-09-27 18:00:04

我找了很多解决方案,但最终还是找不到。所以我希望这里有人能帮我。

我有一个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();
        }
    }

现在问题来了;当我在VisualStudio中调试时,我看到三个对象中的两个已经填充。以下是我从调试器中截取的屏幕截图:http://www.smartus.be/xmlProblem/debugger.png

正如您所看到的,DocProperties和ReleaseNoteProperties是正确填写的,但SpecialProperties的值都为null。起初我以为它与下划线有关,但当我在DocProperties中为属性添加下划线时,它也被正确填充了。

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

我还仔细检查了打字错误,但似乎没有。。。

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

提前谢谢。

Vincent

对c#的嵌套XML反序列化提供了null值

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属性。

我已经检查了您的代码。能否删除"Customer_x0020_Name"中的下划线?同时,您需要更改类中的属性名称。它会起作用的。

这些建议对你有帮助吗?

我查过了。。它正在发挥作用。

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

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