如何在xs工具生成的代码中使用带有xs:any/## any的复杂类型并混合使用

MrE*_*yes 7 c# xsd xmlnode xml-serialization

我的XML模式中有以下复杂类型:

<xs:complexType name="Widget" mixed="true">
    <xs:sequence>
        <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

派生XML中的元素可以包含字符串或可以包含格式良好的XML,因此mixed属性为true.

当我通过.NET XSD工具运行时,我得到以下生成代码:

public partial class Widget{

    private System.Xml.XmlNode[] anyField;

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    [System.Xml.Serialization.XmlAnyElementAttribute()]
    public System.Xml.XmlNode[] Any {
        get {
            return this.anyField;
        }
        set {
            this.anyField = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我不完全确定我应该如何使用它.最终我需要能够将widget的值设置为:

<widget>Hello World!</widget>
Run Code Online (Sandbox Code Playgroud)

要么

<widget>
  <foo>Hello World</foo>
</widget>
Run Code Online (Sandbox Code Playgroud)

这两个都验证了架构

pma*_*tin 2

为了这:

<widget>  
    <foo>Hello World</foo>
</widget>
Run Code Online (Sandbox Code Playgroud)

用这个:

XmlDocument dom = new XmlDocument();
Widget xmlWidget = new Widget();
xmlWidget.Any = new XmlNode[1];
xmlWidget.Any[0] = dom.CreateNode(XmlNodeType.Element, "foo", dom.NamespaceURI);
xmlWidget.Any[0].InnerText = "Hello World!";
Run Code Online (Sandbox Code Playgroud)

为了这:

<widget>Hello World!</widget>
Run Code Online (Sandbox Code Playgroud)

用这个:

XmlDocument dom = new XmlDocument();
XmlNode node = dom.CreateNode(XmlNodeType.Element, "foo", dom.NamespaceURI);
node.InnerText = "Hello World";

Widget w = new Widget();
w.Any = new XmlNode[1];
w.Any[0] = node.FirstChild; 
Run Code Online (Sandbox Code Playgroud)