简体   繁体   English

使用 xsd.exe 生成的代码以编程方式构建 xml 文档时出现问题<xs:any></xs:any>

[英]problems building xml document programmatically with xsd.exe generated code when containing <xs:any>

As the title states, i'm trying to programmatically build an xml document.正如标题所述,我正在尝试以编程方式构建 xml 文档。 i have written and compiled the schemas as correctly as i know how, but the <xs:any> implementation is tripping me up when trying to fill in elements defined in those sections.我已经尽我所知正确地编写和编译了模式,但是当我尝试填充这些部分中定义的元素时,<xs:any> 实现让我感到困惑。

Below are 2 example schemas that i am using.以下是我正在使用的 2 个示例模式。 The Primary.xsd optionally uses an element defined in Dependency.xsd. Primary.xsd 可以选择使用 Dependency.xsd 中定义的元素。 They are compiled with xsd.exe using .net 4.8.它们是使用 .net 4.8 使用 xsd.exe 编译的。

Primary.xsd初级.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Primary"
    targetNamespace="http://tempuri.org/Primary.xsd"    
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/Primary.xsd"
    xmlns:mstns="http://tempuri.org/Primary.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:dns="http://tempuri.org/Dependency.xsd">
  
  <xs:import namespace="http://tempuri.org/Dependency.xsd" schemaLocation="Dependency.xsd"/>

  <xs:element name="user">
    <xs:complexType>
      <xs:attribute name="firstName" type="xs:string" use="required"/>
      <xs:attribute name="lastName" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
    
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="user" minOccurs="1"/>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" namespace="http://tempuri.org/Dependency.xsd" />
      </xs:sequence>
    </xs:complexType>    
  </xs:element>  
</xs:schema>

Dependency.xsd依赖.xsd

   <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="Dependency"
               targetNamespace="http://tempuri.org/Dependency.xsd"
               elementFormDefault="qualified"
               xmlns="http://tempuri.org/Dependency.xsd"
               xmlns:mstns="http://tempuri.org/Dependency.xsd"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:simpleType name="systemStateOption">
        <xs:restriction base="xs:string">
          <xs:enumeration value="off"/>
          <xs:enumeration value="running"/>
          <xs:enumeration value="error"/>
        </xs:restriction>
      </xs:simpleType>
    
      <xs:element name="flexibleDetail">
        <xs:complexType>
          <xs:attribute name="systemState" type="mstns:systemStateOption" use="optional"/>
          <xs:anyAttribute processContents="lax"/>
        </xs:complexType>
      </xs:element>
      
    </xs:schema>

Compiled code:编译代码:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.8.3928.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/Dependency.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/Dependency.xsd", IsNullable=false)]
public partial class flexibleDetail : object, System.ComponentModel.INotifyPropertyChanged {
    
    private systemStateOption systemStateField;
    
    private bool systemStateFieldSpecified;
    
    private System.Xml.XmlAttribute[] anyAttrField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public systemStateOption systemState {
        get {
            return this.systemStateField;
        }
        set {
            this.systemStateField = value;
            this.RaisePropertyChanged("systemState");
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool systemStateSpecified {
        get {
            return this.systemStateFieldSpecified;
        }
        set {
            this.systemStateFieldSpecified = value;
            this.RaisePropertyChanged("systemStateSpecified");
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAnyAttributeAttribute()]
    public System.Xml.XmlAttribute[] AnyAttr {
        get {
            return this.anyAttrField;
        }
        set {
            this.anyAttrField = value;
            this.RaisePropertyChanged("AnyAttr");
        }
    }
    
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/Dependency.xsd")]
public enum systemStateOption {
    
    /// <remarks/>
    off,
    
    /// <remarks/>
    running,
    
    /// <remarks/>
    error,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/Primary.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/Primary.xsd", IsNullable=false)]
public partial class user : object, System.ComponentModel.INotifyPropertyChanged {
    
    private string firstNameField;
    
    private string lastNameField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string firstName {
        get {
            return this.firstNameField;
        }
        set {
            this.firstNameField = value;
            this.RaisePropertyChanged("firstName");
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string lastName {
        get {
            return this.lastNameField;
        }
        set {
            this.lastNameField = value;
            this.RaisePropertyChanged("lastName");
        }
    }
    
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/Primary.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/Primary.xsd", IsNullable=false)]
public partial class root : object, System.ComponentModel.INotifyPropertyChanged {
    
    private user userField;
    
    private System.Xml.XmlElement[] anyField;
    
    /// <remarks/>
    public user user {
        get {
            return this.userField;
        }
        set {
            this.userField = value;
            this.RaisePropertyChanged("user");
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAnyElementAttribute()]
    public System.Xml.XmlElement[] Any {
        get {
            return this.anyField;
        }
        set {
            this.anyField = value;
            this.RaisePropertyChanged("Any");
        }
    }
    
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

Test code to build message:构建消息的测试代码:

static void Main(string[] args)
{
    root docRoot = new root();

    user newUser = new user();
    newUser.firstName = "Herman";
    newUser.lastName = "McMullen";

    docRoot.user = newUser;

    //building the optional element here!
    flexibleDetail detail = new flexibleDetail();
    detail.systemState = systemStateOption.running;
    detail.systemStateSpecified = true;

    // This is the best i can do...?
    // I don't like having to rely on raw strings. that is what
    // the code generator should build for me.
    XmlDocument doc = new XmlDocument();

    var element = doc.CreateElement(detail.ToString());
    element.SetAttribute("systemState", detail.systemState.ToString());
    docRoot.Any[0] = element;
    string output = "";
    XmlSerializer serializer = new XmlSerializer(docRoot.GetType());

    // **** Even if i was able to populate, this threw an exception
    using (StringWriter textWriter = new StringWriter())
    {
        serializer.Serialize(textWriter, docRoot);
        output = textWriter.ToString();
    }
}

TRy following:尝试以下:

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

namespace ConsoleApplication11
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            root docRoot = new root();
            user newUser = new user();
            newUser.firstName = "Herman";
            newUser.lastName = "McMullen";
            docRoot.user = newUser;
            //building the optional element here!
            flexibleDetail detail = new flexibleDetail();
            detail.systemState = systemStateOption.running;
            detail.systemStateSpecified = true;
            // ****** this is of type System.Xml.XmlElement, but detail is not?
            // ****** How to populate this?
            
            docRoot.doc = new XmlDocument();
            docRoot.Any = new System.Xml.XmlElement[] { docRoot.doc.CreateElement("Test") };
            string output = "";
            XmlSerializer serializer = new XmlSerializer(typeof(root));
            // **** Even if i was able to populate, this threw an exception
            using (StringWriter textWriter = new StringWriter())
            {
                serializer.Serialize(textWriter, docRoot);
                output = textWriter.ToString();
            }

          
        }
    }
    //------------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated by a tool.
    //     Runtime Version:4.0.30319.42000
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------

    // 
    // This source code was auto-generated by xsd, Version=4.8.3928.0.
    // 

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/Dependency.xsd")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/Dependency.xsd", IsNullable=false)]
    public partial class flexibleDetail : object, System.ComponentModel.INotifyPropertyChanged {
    
        private systemStateOption systemStateField;
    
        private bool systemStateFieldSpecified;
    
        private System.Xml.XmlAttribute[] anyAttrField;
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public systemStateOption systemState {
            get {
                return this.systemStateField;
            }
            set {
                this.systemStateField = value;
                this.RaisePropertyChanged("systemState");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool systemStateSpecified {
            get {
                return this.systemStateFieldSpecified;
            }
            set {
                this.systemStateFieldSpecified = value;
                this.RaisePropertyChanged("systemStateSpecified");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
    
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/Dependency.xsd")]
    public enum systemStateOption {
    
        /// <remarks/>
        off,
    
        /// <remarks/>
        running,
    
        /// <remarks/>
        error,
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/Primary.xsd")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/Primary.xsd", IsNullable=false)]
    public partial class user : object, System.ComponentModel.INotifyPropertyChanged {
    
        private string firstNameField;
    
        private string lastNameField;
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string firstName {
            get {
                return this.firstNameField;
            }
            set {
                this.firstNameField = value;
                this.RaisePropertyChanged("firstName");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string lastName {
            get {
                return this.lastNameField;
            }
            set {
                this.lastNameField = value;
                this.RaisePropertyChanged("lastName");
            }
        }
    
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/Primary.xsd")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/Primary.xsd", IsNullable=false)]
    public partial class root : object, System.ComponentModel.INotifyPropertyChanged {

        public XmlDocument doc { get; set; }
        private user userField;
    
        private System.Xml.XmlElement[] anyField;
    
        /// <remarks/>
        public user user {
            get {
                return this.userField;
            }
            set {
                this.userField = value;
                this.RaisePropertyChanged("user");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute()]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM