Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将复杂类型与xs:any/###any以及XSD工具生成的混合代码一起使用_C#_Xml Serialization_Xsd_Xmlnode - Fatal编程技术网

C# 如何将复杂类型与xs:any/###any以及XSD工具生成的混合代码一起使用

C# 如何将复杂类型与xs:any/###any以及XSD工具生成的混合代码一起使用,c#,xml-serialization,xsd,xmlnode,C#,Xml Serialization,Xsd,Xmlnode,我的XML架构中有以下复杂类型: <xs:complexType name="Widget" mixed="true"> <xs:sequence> <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> 派生XML中

我的XML架构中有以下复杂类型:

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

派生XML中的元素可以包含字符串,也可以包含格式良好的XML,因此混合属性为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;
        }
    }
}
公共部分类小部件{
private System.Xml.XmlNode[]anyField;
/// 
[System.Xml.Serialization.XmlTextAttribute()]
[System.Xml.Serialization.XmlAnyElementAttribute()]
public System.Xml.XmlNode[]任何{
得到{
返回这个.anyField;
}
设置{
this.anyField=值;
}
}
}
我的问题是,我不完全确定我应该如何使用它。最终,我需要能够将widget的值设置为:

<widget>Hello World!</widget>
你好,世界!


你好,世界

这两种验证都不是模式

将此作为一个答案发布,因为从技术上讲它是有效的,并回答了问题。然而,这似乎是一个非常讨厌的黑客。因此,如果有人有其他更好的解决方案,我会洗耳恭听

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;
string mystring=“如果我签入此代码,它至少有喜剧价值”;
XmlDocument thisLooksBad=新的XmlDocument();
thisLooksBad.LoadXml(“+mystring+”);
Widget stringWidget=newwidget();
stringWidget.Any=newXMLNode[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;
string myxml=“something”;
XmlDocument thisdesntlooksobad=新的XmlDocument();
thisLooksBad.LoadXml(myxml);
Widget xmlWidget=newwidget();
xmlWidget.Any=新的XmlNode[1];
xmlWidget.Any[0]=thisDoesntLookSoBad;
在本例中,我将XML放入XmlDocument中,然后将其分配给生成的类。这更有意义,因为我使用的是XML而不是原始字符串

奇怪的是,我也能做到这一点,而且效果也很好(但也是一个讨厌的黑客):

string myxml=“something”;
XmlDocument dom=新的XmlDocument();
LoadXml(“+myxml+”);
Widget xmlWidget=newwidget();
xmlWidget.Any=新的XmlNode[1];
xmlWidget.Any[0]=dom.SelectSingleNode(“/temp”).FirstChild;
为此:

<widget>  
    <foo>Hello World</foo>
</widget>
<widget>Hello World!</widget>
为此:

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

这行不通,您尚未初始化xmlWidget.Any[0]。所以它会抛出一个空引用异常。我更新了答案来处理空引用异常。但是,我不确定您是否能够完成“仅内部文本”选项。在代码中这样做意味着Widget类既可以用作字符串类型,也可以用作节点数组。我认为标准XSD生成不可能做到这一点。我做了一次编辑,与您发布的代码非常相似。我不确定你是否会找到一种不同的方法来做这件事。实际上,您正在尝试覆盖Widget属性。在一个实例中,您希望它只是一个字符串,而在另一个实例中,您希望它是一个节点数组,但您不能在一个类中多次定义相同名称的属性。为了更明确(并显示代码的意图),您可以将call node.FirstChild替换为dom.CreateTextNode(“Hello World”).以下哪一个例子满足了
你好世界需求。第一个示例反序列化为:如果我在其中检查此代码,它将至少具有您所说的喜剧价值,这可以完成任务,但我更喜欢pmartin的解决方案,因为它更健壮,即不使用字符串concatention来构建Xml DOM。
<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;