首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >剥离<xml>标记的XmlSerializer.Serialize

剥离<xml>标记的XmlSerializer.Serialize
EN

Stack Overflow用户
提问于 2012-04-19 05:19:26
回答 5查看 23.5K关注 0票数 18

我正在尝试与支付处理器进行通信。当我在我的对象上使用XmlSerializer.Serialize时,我得到

代码语言:javascript
复制
<?xml version=\"1.0\" encoding=\"utf-16\"?>
<txn xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
  <ssl_merchant_id>xxxxxx</ssl_merchant_id>
  <ssl_user_id>xxxxxx</ssl_user_id>
  <ssl_pin>xxxxxx</ssl_pin>
  <ssl_test_mode>True</ssl_test_mode>
  <ssl_transaction_type>ccavsonly</ssl_transaction_type>
  <ssl_card_number>4111111111111111</ssl_card_number>
  <ssl_exp_date>0612</ssl_exp_date>
  <ssl_avs_address>101 Main St.</ssl_avs_address>
  <ssl_avs_zip>90210</ssl_avs_zip>
</txn>

在使用该方法之前,我手动构建了用于测试的XML,这很有效:

代码语言:javascript
复制
<txn>
  <ssl_merchant_id>xxxxxx</ssl_merchant_id>
  <ssl_user_id>xxxxxx</ssl_user_id>
  <ssl_pin>xxxxxx</ssl_pin>
  <ssl_test_mode>True</ssl_test_mode>
  <ssl_transaction_type>ccavsonly</ssl_transaction_type>
  <ssl_card_number>4111111111111111</ssl_card_number>
  <ssl_exp_date>0612</ssl_exp_date>
  <ssl_avs_address>101 Main St.</ssl_avs_address>
  <ssl_avs_zip>90210</ssl_avs_zip>
</txn>

我该如何从XML中剥离<?xml version=\"1.0\" encoding=\"utf-16\"?>xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">,或者不让序列化器一开始就生成它们呢?

我的对象看起来像:

代码语言:javascript
复制
[XmlRoot(ElementName="txn")]
public class AvsTransmission
{
    [XmlElement]
    public string ssl_merchant_id { get; set; }
    [XmlElement]
    public string ssl_user_id { get; set; }
    [XmlElement]
    public string ssl_pin { get; set; }
    [XmlElement]
    public string ssl_test_mode { get; set; }
    [XmlElement]
    public string ssl_transaction_type { get; set; }
    [XmlElement]
    public string ssl_card_number { get; set; }
    [XmlElement]
    public string ssl_exp_date { get; set; }
    [XmlElement]
    public string ssl_avs_address { get; set; }
    [XmlElement]
    public string ssl_avs_zip { get; set; }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-19 05:23:33

我的第一个答案只是问题的一半,正如前面提到的,你还必须删除声明。

下面是一个示例:

代码语言:javascript
复制
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

MemoryStream ms = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ms, settings);

XmlSerializerNamespaces names = new XmlSerializerNamespaces();
names.Add("", "");

XmlSerializer cs = new XmlSerializer(typeof(Cat));

cs.Serialize(writer, new Cat { Lives = 9 }, names);

ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
var xml = sr.ReadToEnd();

字符串xml现在包含:

代码语言:javascript
复制
<cat><Lives>9</Lives></cat>
票数 33
EN

Stack Overflow用户

发布于 2014-12-02 22:57:27

第一个函数将对象转换为xml字符串,第二个函数同时将对象转换为xml并将xml写入文件。

代码语言:javascript
复制
    public static string Serialize<T>(T obj)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        var writer = new StringWriter();
        XmlWriter xmlWriter = XmlWriter.Create(writer, settings);

        XmlSerializerNamespaces names = new XmlSerializerNamespaces();
        names.Add("", "");

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        serializer.Serialize(xmlWriter, obj, names);
        var xml = writer.ToString();
        return xml;
    }

    public static void Serialize<T>(T obj, string filepath)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        var writer = new StreamWriter(filepath);
        XmlWriter xmlWriter = XmlWriter.Create(writer, settings);

        XmlSerializerNamespaces names = new XmlSerializerNamespaces();
        names.Add("", "");

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        serializer.Serialize(xmlWriter, obj, names);
    }

实际上,我意识到代码会重复你自己。在这些方法中,只更改了一件事,那就是writer对象,所以代码必须如下所示。通过这些方式,您只需更改编写器对象类型即可轻松使用代码。

代码语言:javascript
复制
    public static string Serialize<T>(T obj)
    {
        var writer = new StringWriter();
        Serialize<T>(obj,writer);
        var xml = writer.ToString();
        return xml;
    }

    public static void Serialize<T>(T obj, string filepath)
    {
        var writer = new StreamWriter(filepath);
        Serialize<T>(obj,writer);
    }

    public static void Serialize<T>(T obj, TextWriter writer)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        XmlWriter xmlWriter = XmlWriter.Create(writer, settings);            
        XmlSerializerNamespaces names = new XmlSerializerNamespaces();
        names.Add("", "");            
        XmlSerializer serializer = new XmlSerializer(typeof(T));            
        serializer.Serialize(xmlWriter, obj, names);
    }
票数 4
EN

Stack Overflow用户

发布于 2016-09-28 10:25:10

与@payo的原始答案非常相似:

如果你想删除命名空间,你可能还想删除版本,为了节省你的搜索,我已经添加了该功能,所以下面的代码可以同时完成这两个功能。

我还将其封装在一个通用方法中,因为我正在创建非常大的xml文件,这些文件太大而无法在内存中序列化,所以我将输出文件拆分并将其序列化为较小的“块”:

代码语言:javascript
复制
public string XmlSerialize<T>(T entity) where T : class
{
    // removes version
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;

    XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
    StringWriter sw = new StringWriter();
    using (XmlWriter writer = XmlWriter.Create(sw, settings))
    {
        // removes namespace
        var xmlns = new XmlSerializerNamespaces();
        xmlns.Add(string.Empty, string.Empty);

        xsSubmit.Serialize(writer, entity, xmlns);
        return sw.ToString(); // Your XML
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10218181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档