XmlSerializer空の変数をシリアル化して両方のタグを使用しますか?

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

  •  05-07-2019
  •  | 
  •  

質問

シリアル化されたxmlクラスをSoap Envelopeにロードできるようにしたい。私は始めているので、内臓を満たしていないので、次のように見えます:

<Envelope    
xmlns="http://schemas.xmlsoap.org/soap/envelope/" /> 

次のように表示したい:

<Envelope    
xmlns="http://schemas.xmlsoap.org/soap/envelope/" ></Envelope>`


私が書いたクラスは次のとおりです。

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/",ElementName="Envelope", IsNullable = true)]
public class TestXmlEnvelope
{
  [System.Xml.Serialization.XmlElement(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
  public System.Collections.ArrayList Body = new System.Collections.ArrayList();
} //class TestXmlEnvelope`

これを例として使用しているのは、他の人が個々の要素でそれを望んでいるからです。これは単純なものでなければならないと確信していますが、悲しいことに、これに適したキーワードがわかりません。

いつもお世話になりました。

[編集]この命令を使用しようとするとエラーが発生します

System.Xml.Serialization.XmlSerializer xmlout = new System.Xml.Serialization.XmlSerializer(typeof(TestXmlEnvelope));
System.IO.MemoryStream memOut = new System.IO.MemoryStream();
xmlout.Serialize(memOut, envelope, namespc);
Microsoft.Web.Services.SoapEnvelope soapEnv = new Microsoft.Web.Services.SoapEnvelope();
soapEnv.Load(memOut);

エラー<!> quot;ルート要素が見つかりません<!> quot;。

[編集]エラーを修正しました。オブジェクトをシリアル化した後、memOut.Position = 0を設定しなかったという問題でした。それでも、この質問が他の人に役立つことを願っています。

役に立ちましたか?

解決

ここでの主な問題は、終了タグを書き込むときに、XmlSerializerWriteEndElement()XmlWriterを呼び出すことです。ただし、これにより、コンテンツがない場合に省略形の<tag/>フォームが生成されます。 WriteFullEndElement()は終了タグを個別に書き込みます。

シリアライザーがその機能を示すために使用する中央に独自のXmlTextWriterを挿入できます。

serializerが適切な<=>であることを考えて、これを試してください:

public class XmlTextWriterFull : XmlTextWriter
{
    public XmlTextWriterFull(TextWriter sink) : base(sink) { }

    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
    }
}

...

var writer = new XmlTextWriterFull(innerwriter);
serializer.Serialize(writer, obj);

[編集]追加したコードの場合、次のファサードコンストラクターを追加します。

public XmlTextWriterFull(Stream stream, Encoding enc) : base(stream, enc) { }
public XmlTextWriterFull(String str, Encoding enc) : base(str, enc) { }

次に、前と同様に、コンストラクターでメモリストリームを内部ストリームとして使用します。

System.IO.MemoryStream memOut = new System.IO.MemoryStream();
XmlTextWriterFull writer = new XmlTextWriterFull(memOut, Encoding.UTF8Encoding); //Or the encoding of your choice
xmlout.Serialize(writer, envelope, namespc);

他のヒント

記録に関する注意:OPは *** Microsoftを使用していました。*** Web.Services.SoapEnvelope クラス。これは非常に廃止されたWSE 1.0製品の一部です。このクラスはXmlDocumentクラスから派生しているため、XmlDocumentでも同じ問題が発生する可能性があります。

新しい開発にWSEを使用してはいけません。また、既に使用されている場合は、できるだけ早くコードを移行する必要があります。 WCFまたはASP.NET Web APIは、今後の.NET Webサービスに使用される唯一のテクノロジーです。

2つの表現は同等です。後者の形式で表示する必要があるのはなぜですか?

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