[英]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;
这是来自资源管理器的 class 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.