繁体   English   中英

XSD 序列化为复杂 object

[英]XSD Serialization to complex object

我正在使用供应商提供的 XML 文档,我使用 XSD 将其转换为可序列化的 object。

这是他们提供的模板 xml。

<?xml version="1.0" encoding="UTF-8"?>
<doi_batch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.crossref.org/schema/4.4.2 https://www.crossref.org/schemas/crossref4.4.2.xsd"
 xmlns="http://www.crossref.org/schema/4.4.2" xmlns:jats="http://www.ncbi.nlm.nih.gov/JATS1"
 xmlns:fr="http://www.crossref.org/fundref.xsd" version="4.4.2">
    <head>
        <doi_batch_id>arg_123_954</doi_batch_id>
        <timestamp>20190430133609</timestamp>
        <depositor>
            <depositor_name>Crossref</depositor_name>
            <email_address>pfeeney@crossref.org</email_address>
        </depositor>
        <registrant>Society of Metadata Idealists</registrant>
    </head>
    <body>
        <journal>
            <journal_metadata language="en">
                <full_title>Journal of Metadata Perfection</full_title>
                <abbrev_title>JOMPer</abbrev_title>
                <doi_data>
                    <doi>10.32013/487529</doi>
                    <resource>https://www.crossref.org/jomper</resource>
                </doi_data>
            </journal_metadata>
        </journal>
    </body>
</doi_batch>

class 生成的量很大。 具有用于组装上述 XML 模式的多个类。

这是 class XSD 生成的 pastebin;

https://pastebin.com/hjG5cCLW

这是来自资源管理器的 class object 的图片。

XMl Object 序列化

我创建create方法的目的是将所有需要的属性传递给它并返回 object 的副本。

// Excerpt
public class CreateXml
    {
        public DoiBatch Create(JournalPostData jPost)
        {
            // Create Batch
            DoiBatch doiBatch = new DoiBatch();

            #region Header

            // Create header for batch
            DoiBatchHead doiHead = new DoiBatchHead();
            // create depositor
            DoiBatchHeadDepositor doiDepositor = new DoiBatchHeadDepositor
            {
                DepositorName = jPost.DepositorName,
                EmailAddress = jPost.DepositorEmail
            };
            // add depositor to head.
            doiHead.Depositor = new[] {doiDepositor};
            // give it a unique guid.
            doiHead.DoiBatchId = new Guid().ToString();
            // give it a timestamp. Don't use local culture so the date settings on system do not matter.
            doiHead.Timestamp = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
            // set owner organization.
            doiHead.Registrant = jPost.DepositorName;

            #endregion

            #region Body

            // create body
            DoiBatchBodyJournalJournalMetadata doiBody = new DoiBatchBodyJournalJournalMetadata();
            DoiBatchBodyJournalJournalMetadataDoiData doiBodyData = new DoiBatchBodyJournalJournalMetadataDoiData();
            // set DOI Reference ID and journal location.
            doiBodyData.Doi = jPost.DoiPrefix + jPost.RefNum;
            doiBodyData.Resource = jPost.BaseUrl + @"?refnum=" + jPost.RefNum;

            // Fill body

            doiBody.DoiData = new[] { doiBodyData };
            doiBody.FullTitle = jPost.Title;
            doiBody.AbbrevTitle = jPost.Title.Substring(0, 10); //truncate title.
            doiBody.Language = "EN";

            // Fill batch

            doiBatch.Head = new [] { doiHead };
            doiBatch.Body = new[] { new[]{ new []{doiBody}}};

            return doiBatch;
        #endregion
        }
    }

当我实例化正文部分时,问题就来了。 期望三个嵌套的 arrays。 我不确定我是否正确地做到了这一点。

我用这个代码序列化了 object;

XmlSerializer doiSubmit = new XmlSerializer(typeof (DoiBatch));

我明白了;

System.InvalidOperationException
  HResult=0x80131509
  Message=Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'NORMIN.DOI.DoiBatchBodyJournalJournalMetadata[][]' to 'NORMIN.DOI.DoiBatchBodyJournalJournalMetadata[]'
error CS0029: Cannot implicitly convert type 'NORMIN.DOI.DoiBatchBodyJournalJournalMetadata[]' to 'NORMIN.DOI.DoiBatchBodyJournalJournalMetadata[][]'

  Source=NORMIN
  StackTrace:
   at NORMIN.JournalSubmit.btnSubmit_Click(Object sender, EventArgs e) in C:\Projects\normin\NORMIN\JournalSubmit.aspx.cs:line 65

  This exception was originally thrown at this call stack:
    [External Code]
    NORMIN.JournalSubmit.btnSubmit_Click(object, System.EventArgs) in JournalSubmit.aspx.cs
    [External Code]

我相信这是由于

doiBatch.Body = new[] { new[]{ new []{doiBody}}};

在创建方法中。

我完全迷失了自己,任何解决这个问题的帮助将不胜感激。

在提供的示例中,xml 是对您的客户使用的实际 xsd 的引用。 我建议使用该文件生成 class 文件,而不是从示例 xml 派生它。

从 xml 生成 class 是基于假设,而 xsd 是适当的数据合同。 你会看到很多数组或列表定义会消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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