【问题标题】:Remove certain attributes (xmlns) using XmlSerializer class使用 XmlSerializer 类删除某些属性 (xmlns)
【发布时间】:2015-05-19 21:52:17
【问题描述】:

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

【问题讨论】:

  • 我从 web 服务获取一个对象,当我序列化该对象时,这就是我得到的 xml
  • ns 是无法解决我的问题的代码,链接自这个问题stackoverflow.com/questions/258960/…
  • 没有传入的 xml,我收到一个对象,然后调用 ToXML 方法。
  • 我现在将此标记为 stackoverflow.com/questions/258960 的副本。您的原始代码几乎是正确的,只是始终添加和清空命名空间,您生成的 XML 中将没有任何内容。如果还不清楚,请告诉我
  • 如果那是真的。我试过了,没用。因此我在这里的例子,我的问题,以及我的链接。你认为如果它有效,我会链接到它并说this doesnt work

标签: c# .net xml-serialization


【解决方案1】:

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

【讨论】:

  • 同样的结果,xmlns 仍在
  • 然后显示传入对象的定义,因为我的测试对象就是输出
  • 我添加了一个小型车辆对象
  • 您是否可以控制 Vehicles 对象的创建/维护?
  • 我希望我做到了......创作是的,维护不是
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多