根据从 XSD 创建的类编写 XML - 问题

问题描述

我已经通过 XSD.exe 从一个相当复杂的 XSD 创建了一个 VB.net 类

这个类看起来像这样(后面还有很多)

<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd","4.8.3928.0"),_
 System.SerializableAttribute(),_
 System.Diagnostics.DebuggerStepThroughAttribute(),_
 System.ComponentModel.DesignerCategoryAttribute("code"),_
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true),_
 System.Xml.Serialization.XmlRootAttribute([Namespace]:="",IsNullable:=false)>  _
Partial Public Class barbadosImportFile
    
    Private informationField As importinformationType
    
    Private b2bDebtorsField() As importB2BDebtorType
    
    Private b2cDebtorsField() As importB2CDebtorType
    
    Private riskAssociationDebtorsField() As importRiskAssociationDebtorType
    
    Private vouchersField() As importVoucherType
    
    Private riskAssociationAssignmentsField() As importRiskAssociationAssignmentType

    Private securitiesField() As importSecurityType
....

现在在我的代码中没有问题

     Dim debXML As New barbadosImportFile

    debXML.information = New importinformationType
    debXML.information.timeStamp = Now()
    debXML.information.systemName = "Presystem"
    debXML.information.numberOfSecurities = 2


    Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(barbadosImportFile))
    Dim writer As New System.IO.StreamWriter("C:\Users\hhl.CORPORATE\OneDrive - Ingram Micro\Desktop\debitex.xml")
    serializer.Serialize(writer,debXML)
    writer.Close()

这会创建一个看起来像我想要的样本的 XML,但样本的一部分还应该是一些其他元素,如 b2bdebtors、b2cdebtors、riskAssociationDebtors、vouchers、riskAssociationAssignments - 都没有数据,尤其是证券 - 安全性,我有基本的我需要包含的数据

XML 应该是这样的

<?xml version="1.0" encoding="utf-8"?>
<barbadosImportFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <information>
    <timeStamp>2021-04-01T15:52:57.727846+01:00</timeStamp>
    <systemName>Presystem</systemName>
    <numberOfB2BDebtors>0</numberOfB2BDebtors>
    <numberOfB2CDebtors>0</numberOfB2CDebtors>
    <numberOfRiskAssociationDebtors>0</numberOfRiskAssociationDebtors>
    <numberOfVouchers>0</numberOfVouchers>
    <numberOfRiskAssociationAssignments>0</numberOfRiskAssociationAssignments>
    <numberOfSecurities>1</numberOfSecurities>
    <numberOfLimits>0</numberOfLimits>
    <numberOfUsers>0</numberOfUsers>
    <numberOfSalesRepresentativeDebtorAssignments>0</numberOfSalesRepresentativeDebtorAssignments>
    <numberOfSoftfactScorings>0</numberOfSoftfactScorings>
    <numberOfExternalIdentifiers>0</numberOfExternalIdentifiers>
    <numberOfVoucherAdditionals>0</numberOfVoucherAdditionals>
    <numberOfDebtorAdditionals>0</numberOfDebtorAdditionals>
    <numberOfCompanyBlacklists>0</numberOfCompanyBlacklists>
    <numberOfPersonBlacklists>0</numberOfPersonBlacklists>
  </information>
  <b2bDebtors />
  <b2cDebtors />
  <riskAssociationDebtors />
  <vouchers />
  <riskAssociationAssignments />
  <securities>
    <security>
      <createdAt>2021-04-01T00:00:00</createdAt>
      <comment />

但我不知道如何启动这些数组字段?

类似的东西

debXML.b2bDebtors(0) = New importB2BDebtorType

抛出“对象未设置为对象的实例”

不幸的是,我无法通过谷歌搜索找到解决方案。

有什么帮助吗?

解决方法

好的,再谷歌搜索我发现了一些有用的东西:

debXML.securities = New importSecurityType(intSize) {}

For i = 0 To intSize
    debXML.securities(i) = New importSecurityType()
Next

这将允许访问这样的属性

debXML.securities(0).companyCode = "AT"

并且按照 XSD 定义的序列化工作得非常好。

,

试试这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication189
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            //BarbadosImportFile BarbadosImportFile = new BarbadosImportFile()
            //{
            //    security = new List<Security>() {
            //       new Security() { createdAt = new DateTime(2014,4,1)}
            //   }
            //};
            //XmlWriterSettings settings = new XmlWriterSettings();
            //settings.Indent = true;
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(BarbadosImportFile));
            BarbadosImportFile barbadosImportFile = (BarbadosImportFile)serializer.Deserialize(reader);
           
        }
    }
    [XmlRoot("barbadosImportFile")]
    public class BarbadosImportFile
    {
        [XmlArray("securities")]
        [XmlArrayItem("security")]
        public List<Security> security { get; set; }
    }
    public class Security
    {
        public DateTime createdAt { get; set; }
        public string comment { get; set; }
    }

  
}