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 答案:
How can I dynamic read a classes XmlTypeAttribute to get the Namespace?

于 2013-01-30T17:56:55.323 回答