使用XmlSerializer类删除某些属性(xmlns)

时间:2015-03-17 12:53:15

标签: c# .net xml-serialization

我需要从每个元素中删除所有xmlns属性。我在c#中使用XmlSerializer类。

以下是我通过序列化Web服务返回的对象获得的XML示例。

序列化代码

public static string ToXML<T>(object obj,string nameSpace)
{
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    var xml = "";

    using (var stringwriter = new StringWriter())
    {
        var serializer = new XmlSerializer(typeof(T));

        serializer.Serialize(stringwriter, obj,ns);

        xml = xml + stringwriter;
    }

    return xml;
}

致电代码

 var unitInfo = RC.GetUnitInfo(txtUnitNum.Text);
 var x = XML.DocumentExtensions.ToXML<Vehicles>(unitInfo, "");

结果

<Vehicles>
  <Unit xmlns="http://Entities/2006/09">430160</Unit> 
  <VinNumber xmlns="http://Entities/2006/09">1FUJGP9337</VinNumber> 
  <CustName xmlns="http://Entities/2006/09">Ryder : N/A</CustName> 
  <CustCode xmlns="http://Entities/2006/09">4199</CustCode> 
  <NationalAccountFVM xmlns="http://Entities/2006/09">0</NationalAccountFVM> 
  <VehMake xmlns="http://Entities/2006/09">FREIGHTLINER/MERCEDES</VehMake> 
  <VehModel xmlns="http://Entities/2006/09">PX12564ST CASCADIA</VehModel> 
  <VehYear xmlns="http://Entities/2006/09">2012</VehYear> 
  <VehDescrip xmlns="http://Entities/2006/09">TRACTOR</VehDescrip> 
  <InService xmlns="http://Entities/2006/09">10/28/2011 12:00:00 AM</InService> 
  <EngMake xmlns="http://Entities/2006/09">CUMMINS ENGINE CO.</EngMake> 
  <EngModel xmlns="http://Entities/2006/09">ISX'10 14.9 450/1800</EngModel> 
  <EngSize xmlns="http://Entities/2006/09">450</EngSize> 
  <EngSerial xmlns="http://Entities/2006/09">79502</EngSerial> 
  <TransMake xmlns="http://Entities/2006/09">FULLER TRANS., DIV. EATON</TransMake> 
</Vehicles

我需要序列化对象而不获取xmlns属性。

车辆对象

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://Entities/2006/09")]
public partial class Vehicles {

    private string unitField;

    private string vinNumberField;

    /// <remarks/>
    public string Unit {
        get {
            return this.unitField;
        }
        set {
            this.unitField = value;
        }
    }

    /// <remarks/>
    public string VinNumber {
        get {
            return this.vinNumberField;
        }
        set {
            this.vinNumberField = value;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我修改了下面的ToXML()方法,以便始终正确排除命名空间。

主要区别在于XmlSerializerNamespaces如何实例化 生成空命名空间会禁用XmlWriter将命名空间插入到输出XML中 我还更改了构建输出XML的方式,因为字符串连接比使用StringBuilderStringWriter一起使用public static string ToXML<T>(object obj) { StringBuilder outputXml = new StringBuilder(); using (var stringwriter = new StringWriter(outputXml)) { // Define a blank/empty Namespace that will allow the generated // XML to contain no Namespace declarations. XmlSerializerNamespaces emptyNS = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") }); var serializer = new XmlSerializer(typeof(T)); serializer.Serialize(stringwriter, obj, emptyNS); } return outputXml.ToString(); } 更耗费资源。

<?xml version="1.0" encoding="utf-16"?>
<Vehicles>
  <Unit>430160</Unit>
  <VinNumber>1FUJGP9337</VinNumber>
  <CustName>Ryder : N/A</CustName>
  <CustCode>4199</CustCode>
  <NationalAccountFVM>0</NationalAccountFVM>
  <VehMake>FREIGHTLINER/MERCEDES</VehMake>
  <VehModel>PX12564ST CASCADIA</VehModel>
  <VehYear>2012</VehYear>
  <VehDescrip>TRACTOR</VehDescrip>
  <InService>2011-10-28T00:00:00</InService>
  <EngMake>CUMMINS ENGINE CO.</EngMake>
  <EngModel>ISX'10 14.9 450/1800</EngModel>
  <EngSize>450</EngSize>
  <EngSerial>79502</EngSerial>
  <TransMake>FULLER TRANS., DIV. EATON</TransMake>
</Vehicles>

传入一个示例对象,我得到了

的输出XML
{{1}}