我需要在具有不同字段名的数据库之间进行同步。我可以将记录从第一个数据库导出到xml文件:
<Table>
<Route No="1108">
<Name No="60">Joe</Name>
<City No="70">City1</City>
</Route>
<Route No="1108">
<Name No="60">John</Name>
<City No="70">City2</City>
</Route>
<Route No="1108">
<Name No="60">Jan</Name>
<City No="70">City4</City>
</Route>
<Route No="1108">
<Name No="60">Jack</Name>
<City No="70">City6</City>
</Route>
</Table>
我可以使用元素名称Route-&gt; Name和City将此XML文件序列化到第二个数据库中。
但发回一些数据是问题所在。我已经宣布了这样的课程:
public class Route
{
[XmlAttribute]
public string No
{
get { return "1108"; }
}
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public string City
{
get { return _City; }
set { _City = value; }
}
}
我可以轻松地在代码中创建它,但是对于100个表来说,这是非常有用的。我想使用de / serialize?
我从没想过这会成为我的表演者。
答案 0 :(得分:1)
你似乎选择了错误的工具。
这是SQL Server Integration Services(SSIS)的工作。这正是它擅长的。
答案 1 :(得分:1)
John Saunders是对的,XML序列化可能不是这项工作的最佳工具......
现在,如果你仍想这样做,如果你想在Name
和City
上添加属性,有两种选择:
实现IXmlSerializable
接口,使您可以完全控制XML序列化过程。主要的缺点是实施起来很繁琐,特别是如果你必须为很多课程做这件事
为Name
和City
制作课程,而不是直接将其表示为字符串。由于所有元素上似乎都有No
属性,因此您可以将它们全部从公共基类继承。您可以使用XmlText
属性将属性序列化为元素的内容。
public abstract class EntityWithNumber
{
[XmlAttribute("No")]
public int Number { get; set; }
}
public class Name : EntityWithNumber
{
[XmlText]
public string Value { get; set; }
}
public class City : EntityWithNumber
{
[XmlText]
public string Name { get; set; }
}
public class Route : EntityWithNumber
{
public Name Name { get; set; }
public City City { get; set; }
}
答案 2 :(得分:0)
设置XMLAttribute属性时,只能向root XML元素添加属性。
答案 3 :(得分:0)
实际上我认为你需要完全不同的东西。
从您提供的代码段中,我猜您可以在这样的对象中反序列化:
[Serializable]
[XmlType(AnonymousType=true)]
[XmlRoot(IsNullable=false)]
public partial class Table {
[XmlElement("Route")]
public TableRoute[] Items { get; set; }
}
}
[Serializable]
[XmlType(AnonymousType=true)]
public partial class TableRoute {
[XmlElement]
public TableRouteItem[] Name { get; set; }
[XmlElement]
public TableRouteItem[] City { get; set; }
[XmlAttribute]
public string No { get; set; }
}
[Serializable]
[XmlType(AnonymousType=true)]
public partial class TableRouteItem {
[XmlAttribute]
public string No { get; set; }
[XmlText]
public string Value { get; set; }
}
您的数据存在的问题是列(或我猜的是列)每个项目的值不止一个。
答案 4 :(得分:0)
阅读并阅读后,我想出了这个。
1。 我添加了自己的属性类?必须有一个更聪明的方式!!
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true)]
public class XMLAttributeProperty : Attribute
{
public XMLAttributeProperty(string name, string value)
{
this.Name = name;
Value = value;
}
public string Name;
public string Value;
}
2。 将这些属性添加到类属性
public class Route
{
[XmlAttribute]
public string No
{
get { return "1108"; }
}
**[XMLAttributeProperty("No", "60")]**
public string Name
{
get { return _Name; }
set { _Name = value; }
}
**[XMLAttributeProperty("No", "70")]**
public string City
{
get { return _City; }
set { _City = value; }
}
}
3。 默认情况下,将类序列化为元素..
<Table>
<Route No="1108">
<Name>Joe</Name>
<City>City1</City>
</Route>
</Table>
4。 我接管并添加属性。
foreach (var property in trp.GetType().GetProperties()) //class ->typeof(Transport).GetProperties()
{
foreach (XMLAttributeProperty att in property.GetCustomAttributes(typeof(XMLAttributeProperty), true).Cast<XMLAttributeProperty>())
{
Log.Level0(string.Format("Property {0}, {1}={2}", property.Name, att.Name, att.Value));
var fieldInElement = el.Descendants(property.Name).FirstOrDefault();
if (fieldInElement != null)
{
try
{
fieldInElement.Add(new XAttribute(att.Name, att.Value));
}
catch { }
}
}
}
5。 这是结果。请评论或向我展示更好/更快的方式。我很高兴但是失去了很多时间。
<Table>
<Route No="1108">
<Name No="60">Joe</Name>
<City No="70">City1</City>
</Route>
</Table>
答案 5 :(得分:0)
这个怎么样?
public class Route
{
[XmlAttribute("No")]
public int Number { get {return "1108";} }
public Name Name { get; set; }
public City City { get; set; }
}
public class Name
{
[XmlAttribute("No")]
public int Number { get {return "60";} }
[XmlText]
public string Value { get; set; }
}
public class City
{
[XmlAttribute("No")]
public int Number { get {return "70";} }
[XmlText]
public string Name { get; set; }
}