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对象不需要的类型属性。