2

Xsdを使用してシリアル化されたWCFプロキシクラスを検証しようとしています。

生成されたXmlには、親要素の名前空間が含まれていませんが、子要素には名前空間が含まれていることに気付きました。これは、検証スローが要素タイプエラーのスキーマ情報を見つけることができなかったことを意味します。

デフォルトの名前空間を手動で追加すると、スキーマ検証が機能します。

私の質問は、リクエストオブジェクトに名前空間のシリアル化属性がある場合、それが自動的に生成されないのはなぜですか?

これは、プロキシ用にシリアル化されたXmlを生成する方法です。

var path = @"C:\DataRequest.xml";
var data = new DataRequest(); 
using (var fileWriter = new StreamWriter(path))
{
   var serializer = new XmlSerializer(data.GetType());
   serializer.Serialize(fileWriter, data);
   fileWriter.Close();
}

これにより、次のDataRequest.xmlが生成されます。

<DataRequest>
  <Data xmlns="urn:some:name:space">
    <Id>1</Id>
  </Data>
</DataRequest>

名前空間のシリアル化属性を持つリクエストオブジェクトは次のとおりです。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17929")]
<other attributes I snipped>
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:some:name:space")]
public partial class DataRequest : object, System.ComponentModel.INotifyPropertyChanged {
4

2 に答える 2

1

XmlSerializerを使用する場合、ルートで名前空間を取得するには、XmlRootAttributeをターゲットクラスに適用する必要があることがわかりました。

于 2012-12-12T15:22:52.090 に答える
1

シリアル化時に名前空間の値を動的に取得することで、この問題を修正しました。

変更された関数は次のとおりです。

var dataType = data.GetType();
var xmlAttribute = (XmlTypeAttribute)Attribute.GetCustomAttribute(dataType, typeof(XmlTypeAttribute));
XNamespace ns = xmlAttribute.Namespace;
using (var fileWriter = new StreamWriter(filePath))
{
   var xSerializer = new XmlSerializer(dataType, ns.NamespaceName);
   xSerializer.Serialize(fileWriter, data);
   fileWriter.Close();    
}


コードはこのSOの答えから来ました:
名前空間を取得するためにクラスXmlTypeAttributeを動的に読み取るにはどうすればよいですか?

于 2013-01-30T17:56:55.323 に答える