如何在xml序列化时添加名称空间

问题描述:

  StringBuilder sb = new StringBuilder(); 
      XmlWriter writer = XmlWriter.Create(sb); 
      XmlSerializer serializer = new XmlSerializer(typeof(OpenShipments)); 
      var ns = new XmlSerializerNamespaces(); 
      ns.Add("x-schema:", @"x-schema:C:\UPSLabel\OpenShipments.xdr"); 
      serializer.Serialize(writer, OS, ns); 
      xmlString = sb.ToString(); 

获取错误对象引用未找到,因为我以编程方式添加了命名空间。 基本上在我的XML命名空间将类似于下一个如何在xml序列化时添加名称空间

<OpenShipments xmlns="x-schema:C:\UPSLabel\OpenShipments.xdr"> 

在这里,我添加行ns.Add("x-schema:", @"x-schema:C:\UPSLabel\OpenShipments.xdr");

和上面的一行我得到错误....什么是我的错误。只是无法弄清楚。请帮助我构建命名空间。

+1

你得到什么错误? – Oded 2011-05-06 06:16:02

尝试这样的:

var sb = new StringBuilder(); 
var myns = @"x-schema:C:\UPSLabel\OpenShipments.xdr"; 
using (var writer = XmlWriter.Create(sb)) 
{ 
    var serializer = new XmlSerializer(typeof(OpenShipments), myns); 
    var ns = new XmlSerializerNamespaces(); 
    ns.Add(string.Empty, myns); 
    serializer.Serialize(writer, OS, ns); 
    xmlString = sb.ToString(); 
} 

将产生:

<OpenShipments xmlns="x-schema:C:\UPSLabel\OpenShipments.xdr"> 
    ... 
</OpenShipments> 
+0

谢谢....你的解决方案的作品。很棒:)。 – Mou 2011-05-06 06:49:04

+0

可以请你告诉我如何添加更多的命名空间。就像ns.Add(string.Empty,myns1); ns.Add(string.Empty,myns2); 这有用吗? – Mou 2011-05-06 06:50:31

线:

ns.Add("x-schema:", @"x-schema:C:\UPSLabel\OpenShipments.xdr"); 

被添加别名,即允许串行器使用x-schema:的XML内部。但是,这并不会使您的对象使用此名称空间;对于这一点,你需要(在你的类型):

[XmlRoot([email protected]"x-schema:C:\UPSLabel\OpenShipments.xdr")] 
public class OpenShipments {...} 

(或东西等效,可能使用XmlAttributeOverrides

注意与别名添加,您将获得:

<x-schema:OpenShipments xmlns:x-schema="x-schema:C:\UPSLabel\OpenShipments.xdr" /> 

要得到它没有别名,你想:

ns.Add("", @"x-schema:C:\UPSLabel\OpenShipments.xdr"); 

这使输出:

<OpenShipments xmlns="x-schema:C:\UPSLabel\OpenShipments.xdr" />