7

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になります。

これを.NETXSDツールで実行すると、次の生成コードが表示されます。

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>

どちらもスキーマを検証しません

4

2 に答える 2

2

このため:

<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; 
于 2011-02-11T21:22:25.643 に答える
0

これを回答として投稿すると、技術的に機能し、質問に回答します。しかし、それは本当に厄介なハックのようです。したがって、誰かが代替のより良い解決策を持っている場合、私はすべて耳を傾けます。

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;
于 2011-02-11T21:10:09.587 に答える