C# 将对象序列化为特定格式,删除名称空间并移动属性

C# 将对象序列化为特定格式,删除名称空间并移动属性,c#,c#-4.0,serialization,xml-serialization,C#,C# 4.0,Serialization,Xml Serialization,我正在尝试为必须以特定格式导出数据的应用程序构建序列化,下面是预期的示例: <?xml version="1.0" encoding="utf-8"?> <sync> <table name="Test" diff="0" mode="db"> <keys> <key>MY_NUMBER</key> <key>ID</key> </keys>

我正在尝试为必须以特定格式导出数据的应用程序构建序列化,下面是预期的示例:

<?xml version="1.0" encoding="utf-8"?>
<sync>
  <table name="Test" diff="0" mode="db">
    <keys>
      <key>MY_NUMBER</key>
      <key>ID</key>
    </keys>
    <items task="modify">
      <item ID="OK" MY_NUMBER="two"/>
      <item ID="NT" MY_NUMBER="two"/>
    </items>
  </table>
  <table name="Second" diff="1" mode="x">
    <keys>
      <key>ID</key>
    </keys>
    <items task="add">
      <item ID="x" TYPE="c"/>
    </items>
  </table>
</sync>

我的电话号码
身份证件
身份证件
我也得到了类似的结果:

<?xml version="1.0" encoding="utf-8"?>
<sync>
  <table name="Test" diff="0" mode="db" task="modify">
    <keys>
      <key>MY_NUMBER</key>
      <key>ID</key>
    </keys>
    <items>
      <item d4p1:type="FirstItem" ID="OK" MY_NUMBER="two" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
      <item d4p1:type="FirstItem" ID="NT" MY_NUMBER="two" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
    </items>
  </table>
  <table name="SecondTest" diff="1" mode="x" task="add">
    <keys>
      <key>ID</key>
    </keys>
    <items>
      <item d4p1:type="SecondItem" ID="x" TYPE="c" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
    </items>
  </table>
</sync>

我的电话号码
身份证件
身份证件
但我得到了不需要的名称空间,我尝试过这样搜索解决方案(,),但没有运气

我的类定义如下:

namespace Sync.Models
{
    [XmlRoot("sync")]
    [XmlInclude(typeof(FirstItem))]
    [XmlInclude(typeof(SecondItem))]
    public class Export
    {
        [XmlElement(ElementName = "table")]
        public Table users { get; set; }

        [XmlElement(ElementName = "table2")]
        public Table items { get; set; }
    }

    public class Table
    {
        [XmlAttribute("name")]
        public string name { get; set; }
        [XmlAttribute("diff")]
        public int diff { get; set; }
        [XmlAttribute("mode")]
        public string mode { get; set; }

        [XmlArray("keys")]
        [XmlArrayItem("key")]
        public List<string> Keys { get; set; }

        [XmlArray("items")]
        [XmlArrayItem("item")]
        public List<BaseItem> Items { get; set; }

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

    public class FirstItem:BaseItem
    {
        [XmlAttribute("MY_NUMBER")]
        public string Number { get; set; }
    }
    public class SecondItem:BaseItem
    {
        [XmlAttribute("TYPE")]
        public string Type { get; set; }
    }
}
namespace Sync.Models
{
[XmlRoot(“同步”)]
[xmlclude(typeof(FirstItem))]
[xmlclude(typeof(SecondItem))]
公共类出口
{
[xmlement(ElementName=“table”)]
公共表用户{get;set;}
[XmlElement(ElementName=“table2”)]
公共表项{get;set;}
}
公共类表
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[xmldattribute(“diff”)]
公共int diff{get;set;}
[XmlAttribute(“模式”)]
公共字符串模式{get;set;}
[XmlArray(“键”)]
[XmlArrayItem(“键”)]
公共列表键{get;set;}
[XmlArray(“项”)]
[XmlArrayItem(“项目”)]
公共列表项{get;set;}
[XmlAttribute(“任务”)]
公共字符串任务{get;set;}
}
公共类FirstItem:BaseItem
{
[XmlAttribute(“我的号码”)]
公共字符串编号{get;set;}
}
公共类第二项:BaseItem
{
[XmlAttribute(“类型”)]
公共字符串类型{get;set;}
}
}
最后是我的序列化功能:

var testData = new Export
{
    users = new Table
    {
        name = "Test",
        diff = 0,
        mode = "db",
        Keys = new List<string> { "MY_NUMBER", "ID" },
        Items = new List<BaseItem>
        {

            new FirstItem {Id = "OK", Number = "two"},
            new FirstItem {Id = "NT", Number = "two"}
        },
        Task = "modify"
    },
    items = new Table
    {
        name = "SecondTest",
        diff = 1,
        mode = "x",
        Keys = new List<string> { "ID" },
        Items = new List<BaseItem>
        {
            new SecondItem{Id = "x",Type = "c"}
        },
        Task = "add"
    }
};


var fileName_tmp = String.Format(@"{0}\xml1.xml", Application.StartupPath);
var fileName = String.Format(@"{0}\xml.xml", Application.StartupPath);

var serializer = new XmlSerializer(typeof(Export));
using (TextWriter writer = new StreamWriter(fileName_tmp))
{
    serializer.Serialize(writer, testData, new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty}));
}

using (FileStream inputStream = File.OpenRead(fileName_tmp))
{
    using (StreamReader inputReader = new StreamReader(inputStream))
    {
        using (StreamWriter outputWriter = File.CreateText(fileName))
        {
            string tempLineValue;
            while (null != (tempLineValue = inputReader.ReadLine()))
            {
                outputWriter.WriteLine(tempLineValue.Replace("table2", "table"));
            }
        }
    }
}
var testData=新导出
{
用户=新表
{
name=“Test”,
差异=0,
mode=“db”,
Keys=新列表{“我的号码”,“ID”},
项目=新列表
{
新的第一项{Id=“OK”,Number=“two”},
新的第一项{Id=“NT”,Number=“two”}
},
Task=“修改”
},
项目=新表
{
name=“SecondTest”,
差异=1,
mode=“x”,
Keys=新列表{“ID”},
项目=新列表
{
新的第二项{Id=“x”,Type=“c”}
},
Task=“添加”
}
};
var fileName_tmp=String.Format(@“{0}\xml1.xml”,Application.StartupPath);
var fileName=String.Format(@“{0}\xml.xml”,Application.StartupPath);
var serializer=新的XmlSerializer(typeof(Export));
使用(TextWriter writer=newstreamwriter(文件名\u tmp))
{
serializer.Serialize(writer、testData、新的XmlSerializerNames(新[]{XmlQualifiedName.Empty}));
}
使用(FileStream inputStream=File.OpenRead(fileName\u tmp))
{
使用(StreamReader inputReader=新StreamReader(inputStream))
{
使用(StreamWriter outputWriter=File.CreateText(文件名))
{
字符串模板值;
而(null!=(tempLineValue=inputReader.ReadLine())
{
outputWriter.WriteLine(tempLineValue.Replace(“表2”、“表”));
}
}
}
}
1。我想从节点中删除不需要的名称空间和类型属性,但正如我之前所写的,我发现的解决方案不起作用。
2.我需要有多个同名的节点(
table
),因为现在我唯一的解决方案是在序列化后替换标记。我知道我可以使用列表来存储表,但在序列化过程中,这给了我一个额外的不需要的级别,可以删除吗?或者自定义序列化是唯一选项?

3.现在
Task
表中的属性作为表节点的属性存储在xml中。我是否可以将其移动到
项目
,以获得所需的结果?或者我必须创建自定义序列化吗?

您可以通过添加此代码来删除命名空间

using (FileStream stream = new FileStream("FilePath",FileMode.Create))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(YourClass));
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");                    
                    serializer.Serialize(stream," Your Object to Serialize",ns);
                }

我试过了,但当我使用
xmlclude
时,我得到了item对象不需要的类型属性。