微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决根据从 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; }
    }

  
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。