c# - 嵌套的 XML 反序列化到 c# 给出空值

标签 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 等属性之上添加属性,但这也无济于事。

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

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

提前致谢。

文森特

最佳答案

将您的 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 属性。

关于c# - 嵌套的 XML 反序列化到 c# 给出空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264796/

相关文章:

c# - 使用 'Microsoft.Office.Interop.Word._Document.Close'时编译时警告

Android布局标题栏不可见

java - 如何获取 XSD 文件中未定义的所有 XML 元素的列表

json - Jackson 反序列化递归对象

c# - 使用来自 WCF 客户端的非 wcf SOAP 错误(已定义 soap 错误)

c# - 按钮.PerformClick();不在表单加载中工作

c# - 从 Roslyn SyntaxTree 中删除所有 SyntaxTrivia 节点

java - 如何在xml文件中调用外部xsd?

c# - 将 List<T> 序列化为 XML,并将 XML 反转为 List<T>

c++ - 结构中浮点 vector 的序列化