Как использовать сложные типы с xs: any / ## any и смешивать в коде, созданном инструментом XSD - PullRequest
7 голосов
/ 11 февраля 2011

В моей схеме 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 Tool, я получаю следующий код генерации:

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>Hello World!</widget>

или

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

Оба из которых проверяют схему

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Для этого:

<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; 
0 голосов
/ 12 февраля 2011

Опубликовать это как ответ, так как технически это работает и отвечает на вопрос.Однако, это похоже на очень неприятный хак.Так что, если у кого-то есть альтернативное и лучшее решение, у меня все на слух.

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