xml - 复杂对象的 XSD 序列化
问题描述
我正在处理供应商提供的 XML 文档,我使用 XSD 将其转换为可序列化对象。
这是他们提供的模板 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>
它产生的类是巨大的。具有用于组装上述 XML 模式的多个类。
这是 XSD 生成的类的 pastebin;
这是资源管理器中类对象的图片。
我创建该create
方法的目的是将所有需要的属性传递给它并返回对象的副本。
// 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
}
}
当我实例化正文部分时,问题就来了。它期望三个嵌套数组。我不确定我是否正确地做到了这一点。
我用这段代码序列化对象;
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 的引用。我建议使用该文件来生成类文件,而不是从示例 xml 派生它。
从 xml 生成一个类是基于假设,而 xsd 是一个适当的数据契约。你会看到很多数组或列表定义会消失。
推荐阅读
- activemq - Activemq 代理挂起,hikariCP 和自动提交设置为 false
- python - 我试图在 Python 中的 Number 查找中键入一些数字,但它没有得到任何数字
- python-3.x - 部署无服务器应用程序时 aws-sam-cli 和 jmespath 版本不兼容
- docker - K8s 中的 Docker + Fluentd 进行日志轮换:Docker 是否需要知道 Fluentd 的存在?
- angular - 在继承的组件之间切换可观察数据时遇到问题
- java - Gradle 多模块项目编译因子模块中提到的依赖项中的“classNotFoundExceptions”而失败
- javascript - 尝试在不使用 NPM 或 webpack 的情况下使用 Vue js 插件
- python - 将字典列表分组为类对象
- amazon-web-services - AWS EC2 import-image:ClientError:磁盘验证失败[我们无权访问给定资源。原因 403 禁止
- web-crawler - 仅将 Nutch 限制为种子路径及其以下网页