ns-prefixed要素を持たない接頭辞付きの名前空間を持つXMLドキュメントをデシリアライズする方法は?

StackOverflow https://stackoverflow.com/questions/465825

質問

外部ソースからのXMLドキュメントがあります。

<?xml version="1.0" encoding="utf-8"?>
<ns0:Info xmlns:ns0="http://www.ZomboCorp.com/">
  <Name>Anthony</Name>
  <Job>Developer</Job>
</ns0:Info>

このようなオブジェクトにデシリアライズする必要があります。

public class Info
{
    public String Name { get; set; }
    public String Job { get; set; }
}

そのまま使用すると、SerializerInvalidOperationException

をスローします
  

<Info xmlns='http://www.ZomboCorp.com/'>は予期されていませんでした。

[XmlElement(Namespace = "http://www.ZomboCorp.com/")]をクラス定義に追加すると、Infoはnullプロパティを持つ新しい<=>オブジェクトを返します。

役に立ちましたか?

解決 2

xsd.exe (a VSツール)、XMLファイルからスキーマを生成し、次にスキーマからクラスファイルを生成しました。提案しました

[XmlType(AnonymousType = true, Namespace = "http://www.ZomboCorp.com/")]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/", IsNullable = false)]
public class Info
{
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Name { get; set; }
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Job { get; set; }
}

しかし、私は逃げることができました

[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
public class Info
{
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Name { get; set; }
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Job { get; set; }
}

他のヒント

XmlElement属性を各プロパティにも追加し、Namespaceプロパティを空の文字列に設定する必要があります(状況ではネームスペースが継承されないため)。

Infoの定義は次のようになります。

XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
public class Info
{
    [XmlElement(Namespace = "")]
    public String Name { get; set; }
    [XmlElement(Namespace = "")]
    public String Job { get; set; }
}

その後、正しくデシリアライズされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top