如何使用复杂的类型与XS:任何/ ##的任何和混合由XSD工具生成的代码

问题描述:

我在我的XML架构以下复杂类型:如何使用复杂的类型与XS:任何/ ##的任何和混合由XSD工具生成的代码

<xs:complexType name="Widget" mixed="true"> 
    <xs:sequence> 
     <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

中的源XML元素可以包含字符串或可能包含格式良好的XML,因此混合属性为真。

当我通过.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; 
     } 
    } 
} 

我的问题是,我不完全知道应该怎么然后用这个。最后,我需要能够对widget的值设置为:

<widget>Hello World!</widget> 

<widget> 
    <foo>Hello World</foo> 
</widget> 

这两者的验证agaisnt架构

对于这一点:

<widget> 
    <foo>Hello World</foo> 
</widget> 

使用此:

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!"; 

对于此:

<widget>Hello World!</widget> 

使用此:

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; 

发布这是一个答案,因为在技术上它的工作原理并回答这个问题。然而,它似乎是一个非常讨厌的黑客。所以如果有人有另一种更好的解决方案,我就会全神贯注。

string mystring= "if I check this code in it will at least have comedy value"; 

XmlDocument thisLooksBad = new XmlDocument(); 
thisLooksBad.LoadXml("<temp>" + mystring + "</temp>"); 

Widget stringWidget = new Widget(); 
stringWidget.Any = new XmlNode[1]; 
stringWidget.Any[0] = thisLooksBad.SelectSingleNode("/temp").FirstChild; 

正如你看到的,我把我的字符串转换成包裹在标签一个XmlDocument,这个工程,编译并没有问题连载 - 所以是的,它是一个解决方案,但它给我的印象,这是一个讨厌的黑客。

string myxml = "<x><y>something</y></x>"; 

XmlDocument thisDoesntLookSoBad = new XmlDocument(); 
thisLooksBad.LoadXml(myxml); 

Widget xmlWidget = new Widget(); 
xmlWidget.Any = new XmlNode[1]; 
xmlWidget.Any[0] = thisDoesntLookSoBad; 

在这个例子中,我将我的XML放入一个XmlDocument,然后将其分配给生成的类。这更有意义,因为我正在使用XML而不是原始字符串。

奇怪的是我也能做到这一点,它的工作原理,以及(而且是一个讨厌的黑客):

string myxml = "<x><y>something</y></x>"; 

XmlDocument dom = new XmlDocument(); 
dom.LoadXml("<temp>" + myxml + "</temp>"); 

Widget xmlWidget = new Widget(); 
xmlWidget.Any = new XmlNode[1]; 
xmlWidget.Any[0] = dom.SelectSingleNode("/temp").FirstChild; 
+0

其中的这些例子satifies了`的Hello World一个!`要求。 – pmartin 2011-02-11 22:05:44

+0

第一个样本反译为:如果我检查它的代码将至少有喜剧值 MrEyes 2011-02-12 00:45:51