[英]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.