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



我需要从每个元素中删除所有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;
        }
    }
}

我在下面修改了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

<?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>

最新更新