如何使用复杂的类型与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;
其中的这些例子satifies了`的Hello World一个! `要求。 –
pmartin
2011-02-11 22:05:44
第一个样本反译为:如果我检查它的代码将至少有喜剧值 –
MrEyes
2011-02-12 00:45:51