Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于从XSD创建的类编写XML-问题_Xml_Vb.net_Xsd - Fatal编程技术网

基于从XSD创建的类编写XML-问题

基于从XSD创建的类编写XML-问题,xml,vb.net,xsd,Xml,Vb.net,Xsd,我已经通过XSD.exe从一个非常复杂的XSD创建了一个VB.net类 这门课看起来像这样(后面还有很多) 这创建了一个看起来像我想要的示例的XML,但示例的一部分还应该是一些其他元素,如b2bdebtors、b2cdebtors、RiskAssociationDetors、凭单、riskAssociationAssignments—所有这些都没有数据,尤其是证券—安全性,我有需要包含的基本数据 XML应该是这样的 <?xml version="1.0" encodin

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

这门课看起来像这样(后面还有很多)

这创建了一个看起来像我想要的示例的XML,但示例的一部分还应该是一些其他元素,如b2bdebtors、b2cdebtors、RiskAssociationDetors、凭单、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.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; }
    }

  
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序189
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
//巴巴多斯导入文件巴巴多斯导入文件=新的巴巴多斯导入文件()
//{
//安全性=新列表(){
//新安全性(){createdAt=new DateTime(2014,4,1)}
//   }
//};
//XmlWriterSettings=新的XmlWriterSettings();
//settings.Indent=true;
XmlReader=XmlReader.Create(文件名);
XmlSerializer serializer=新的XmlSerializer(typeof(巴巴多斯导入文件));
巴巴多斯导入文件巴巴多斯导入文件=(巴巴多斯导入文件)序列化程序。反序列化(读取器);
}
}
[XmlRoot(“巴巴多斯导入文件”)]
公共类导入文件
{
[XmlArray(“证券”)]
[XmlArrayItem(“担保”)]
公共列表安全性{get;set;}
}
公共安全
{
public DateTime createdAt{get;set;}
公共字符串注释{get;set;}
}
}

私有属性不会序列化。您需要将私有属性更改为public。@jdweng这只是从xsd生成的类的开始,正如您可以看到的,例如private informationField as importInformationType importInformationType是具有私有字段的部分公共类,但public属性获取/设置值。根据我的代码,序列化对于“信息”非常有效——我只是不知道如何处理数组字段(例如Private securitiesField()作为importSecurityType)
debXML.securities = New importSecurityType(intSize) {}

For i = 0 To intSize
    debXML.securities(i) = New importSecurityType()
Next
debXML.securities(0).companyCode = "AT"
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; }
    }

  
}