1

xsd.exe (xsd.exe someschema.xsd /classes) で生成されたクラスがあります。ノードの 1 つが要素として宣言されます。

<xs:element name="containsxmlelementsbeneath"/>

(架空の)名前が示すように、次のようになります。

<containsxmlelementsbeneath>
  <somemore>
    ...
  </somemore>
</containsxmlelementsbeneath>

逆シリアル化されると、デバッガーで型であることがわかります

System.Xml.XmlNode[]

イミディエイト ウィンドウで強制できます

?((System.Xml.XmlNode[])elem.containsxmlelementsbeneath)[0].InnerXml

コードでスニペットを試してみると、IntelliSense がありませんでした。これは、WinRT プロファイルからクラスが削除されたようです。この場合。

その要素の文字列表現を取得するにはどうすればよいですか? xsd.exe で生成された出力を "修正" して、シリアル化に Windows.Data.Xml.Dom を使用する方法はありますか? (私にはそう見えません)

彼らが考えていなかったフリンジケースにぶつかったのですか?

更新-次を試しました(私は知っています、動的の乱用):

dynamic x = elem.containsxmlelementsbeneath;
string s = x[0].InnerXml;

これにより、「API 'System.Xml.XmlNode[]' は現在のプラットフォームでは使用できません」という結果になります。

4

1 に答える 1

1

私は別の開発者と(より長い)チャットをしました-いくつかの試行錯誤の後、解決策を思いつきました:

<xs:element ref="containsxmlelementsbeneath"/>

<xs:element name="containsxmlelementsbeneath">
</xs:element>

これにより、(xsd.exe を介して) 空のクラスが作成されます。

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class containsxmlelementsbeneath
{
}

これは次のように変更する必要があります。

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class containsxmlelementsbeneath : IXmlSerializable
{
    [XmlIgnore]
    public string Text { get; set; }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new System.NotImplementedException();
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        Text = reader.ReadInnerXml();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        throw new System.NotImplementedException();
    }
}

XmlRoot 以外のすべての属性を削除する必要があることに注意してください。そうしないと、Reflection Exceptions が発生します (containsxmlelementsbeneath 型には XmlRoot 属性のみを指定できます。スキーマ型を指定するには、XmlSchemaProviderAttribute を使用してください)。

最終結果: すべてのサブノードをプレーンな古い文字列として持つこのノード。アクセスできない XmlNode または XmlElement はもうありません...

于 2012-10-31T21:06:40.423 に答える