繁体   English   中英

xml 序列化 - 删除命名空间

[英]xml serialization - remove namespace

我正在使用 c# 序列化一个对象。 我得到了下面给出的这种格式的结果

<?xml version="1.0"?>
<Users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Users>
        <User Id="11005477969327" CreateDate="06/03/2011" LastSendDate="1/1/0001" />
        <User Id="11034688201594" CreateDate="04/22/2012" LastSendDate="1/1/0001" />
    <Users 
</User>

    

但我想要这种格式的结果。

<?xml version="1.0"?>
<Users>
  <User Id="11005477969327" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" />
  <User Id="11034688201594" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" />
</Users>

这是我的代码:

public class Users
{
    [XmlArray("Users")]
    public List<User> ListData { get; set; }

    public string GetXML()
    {
        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        XmlSerializer sr = new XmlSerializer(typeof(Users));
        sr.Serialize(ms, this);

        ms.Position = 0;
        return System.Text.Encoding.UTF8.GetString(ms.ToArray());
    }
}

public class User
{
    [XmlAttribute("Id")]
    public Int64 UserId { get; set; }

    [XmlAttribute("CreateDate")]
    public string CreateDate { get; set; }

    [XmlAttribute("LastSendDate")]
    public string LastSendDate { get; set; }
}

您应该简单地将[XmlArray("Users")]替换为[XmlElement("User")]

此属性告诉序列化器,您希望将所有这些用户项存储在特定节点“用户”下,如果您将其替换为XmlElement ,序列化器将按照您的喜好内联存储所有这些用户(就在第一个 Users 标签下)。

至于xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"命名空间。 它们是自动添加的,但它们是无害的,因为您的所有元素都在默认命名空间中。 您可以将以下代码添加到您的XmlSerializer调用中以删除它们:

var xns = new XmlSerializerNamespaces();
var serializer = new XmlSerializer(users.GetType());
xns.Add(string.Empty, string.Empty);
//...
serializer.Serialize(stream, users, xns);

你应该写:

XmlSerializer sr = new XmlSerializer(typeof(Users));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
sr.Serialize(ms, this, ns);

Quickie 解决方案 - 转换为字符串,然后因此删除 - 使用按钮单击开始执行。

Imports System.IO
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim mydoc As XElement = XElement.Load("C:\Users\Documents\myfile.XML")
    Dim y As String = mydoc.ToString
    Dim z As String = mydoc.Name.Namespace.ToString
    Dim getrid As String = " xmlns=" & Chr(34) & z & Chr(34)
    y = Replace(y, getrid, "")
    Dim tr As TextReader = New StringReader(y)
    Dim newdoc As XElement = XElement.Load(tr)
    tr.Close()
    Debug.Print(newdoc.ToString)
End Sub
End Class

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM