私は次のXMLをデシリアライズしようとしています:
_<?xml version="1.0" encoding="UTF-8"?>
<XGResponse><Failure code="400">
Message id '1' was already submitted.
</Failure></XGResponse>
_
この呼び出しを通じて:
_[...]
var x = SerializationHelper.Deserialize<XMLGateResponse.XGResponse>(nResp);
[...]
public static T Deserialize<T>(string xml)
{
using (var str = new StringReader(xml))
{
var xmlSerializer = new XmlSerializer(typeof(T));
return (T)xmlSerializer.Deserialize(str);
}
}
_
対応するクラスのインスタンスを取得するには:
_//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18052
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Xml.Serialization;
//
// This source code was auto-generated by xsd, Version=4.0.30319.1.
//
namespace XMLGateResponse
{
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/XMLGateResponse")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/XMLGateResponse", IsNullable = false)]
public partial class XGResponse
{
private object[] itemsField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Failure", typeof(Failure))]
[System.Xml.Serialization.XmlElementAttribute("Success", typeof(Success))]
public object[] Items
{
get
{
return this.itemsField;
}
set
{
this.itemsField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/XMLGateResponse")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/XMLGateResponse", IsNullable = false)]
public partial class Failure
{
private string codeField;
private string titleField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType = "NMTOKEN")]
public string code
{
get
{
return this.codeField;
}
set
{
this.codeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string title
{
get
{
return this.titleField;
}
set
{
this.titleField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/XMLGateResponse")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/XMLGateResponse", IsNullable = false)]
public partial class Success
{
private string titleField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string title
{
get
{
return this.titleField;
}
set
{
this.titleField = value;
}
}
}
}
_
ただし、エラーThere is an error in XML document (2, 2)
が発生します。
この問題の解決策を約1時間探しましたが、あまり役に立ちませんでした。
私は何もしないはずのわずかな変更を試みました:
_public static T Deserialize<T>(string xml)
{
[...]
var xmlSerializer = new XmlSerializer(typeof(T), new XmlRootAttribute(typeof(T).Name));
[...]
}
_
しかし、これはエラーの発生を防ぎます。しかし、XMLGateResponse.XGResponseインスタンスを完全に空(すべての要素/属性がnull)に戻すだけなので、実際には改善されません。
この種の質問There is an error in XML document (2, 2)
についてはすでに多くの議論が行われていることは知っていますが、私にとって有効な解決策は見つかりませんでした。
XGResponseには、デフォルトのネームスペース名を指定するXmlRootAttribute
が付いていますが、ドキュメントには指定されていません。
この名前空間宣言を削除するか、XMLのルート要素にxmlns="http://tempuri.org/XMLGateResponse"
を追加してください
間違った型にデシリアライズしようとすると、同じエラーが発生する可能性があります。
たとえば、あなたが電話した場合
Deserialize<object>(myXml)
または
Deserialize<Failure>(myXml)
1)回答がすでに提供されており、2)回答が質問者が求めたものと正確に一致しない場合、Qに回答するのは悪い習慣です。しかし、他の誰かが質問者とまったく同じではない問題でここに道を見つけるための時間を節約できるかもしれないと思います。