Pregunta Cómo usar los tipos complejos con xs: any / ## any y mezclado en el código generado por la herramienta XSD


Tengo el siguiente tipo complejo en mi esquema XML:

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

El elemento en el XML derivado podría contener cadenas o podría contener XML bien formado, por lo tanto, el atributo mixto es verdadero.

Cuando ejecuto esto a través de la herramienta .NET XSD, obtengo el siguiente código de generación:

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;
        }
    }
}

La pregunta que tengo es que no estoy del todo seguro de cómo debo usar esto. En última instancia, necesito poder establecer el valor del widget en:

<widget>Hello World!</widget>

o

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

Ambos validan en comparación con el esquema


7
2018-02-11 13:14


origen


Respuestas:


Para esto:

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

Utilizar esta:

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

Para esto:

<widget>Hello World!</widget>

Utilizar esta:

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; 

2
2018-02-11 21:22



Publicar esto como una respuesta ya que técnicamente funciona y responde la pregunta. Sin embargo, parece un truco realmente desagradable. Entonces, si alguien tiene una solución alternativa y mejor, soy todo oídos.

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;

Como pueden ver, coloco mi cadena en un XmlDocument envuelto en etiquetas, esto funciona, compila y serializa sin problemas, así que sí, es una solución, pero me sorprende que este sea un hack desagradable.

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;

En este ejemplo, coloco mi XML en un XmlDocument y luego lo asigno a la clase generada. Esto tiene más sentido ya que estoy trabajando con cadenas XML no en bruto.

Curiosamente, también puedo hacer esto y funciona también (pero también es un hack desagradable):

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
2018-02-11 21:10