我需要创建一个包含大量数据的XML文件。
以下是标签结构的高级视图(为清楚起见,我省略了很多标签)。
<CountyRolls>
<Municipality>
<Item>
<PropertyInfo>
</PropertyInfo>
</Item>
</Municipality>
</CountyRolls>
CountyRolls 是我的根元素 市政是重复元素,可能约为1至25倍 项目是一个可能重复数十万次的重复元素 PropertyInfo 是Item下方元素的示例。
为了节省一些工作,我利用XSD.exe程序从XML Schema Definition文件生成类。它创建了类:
CountyRollsType ,其中包含CountyRollsTypeMunicipality数组。
CountyRollsTypeMunicipality ,其中包含CountyRollsTypeMunicipalityItem数组
CountyRollsTypeMunicipalityItem ,其中包含CountyRollsTypeMunicipalityItemPropertyInfo和其他类型,我没有打扰显示。
CountyRollsTypeMunicipalityItemPropertyInfo 是CountyRollsTypeMunicipalityItemPropertyInfo下的一种数据类型的示例。
由于数据量很大,我无法在内存中创建CountyRollsType对象并使用XmlSerializer对其进行序列化。但我希望利用序列化CountyRollsTypeMunicipalityItem对象。市政府可以拥有数十万件物品。所以我打算做一个循环,每次迭代都会创建一个CountyRollsTypeMunicipalityItem对象,填充其数据然后序列化它。但是我一直无法使用XmlSerializer以我想要的方式序列化CountyRollsTypeMunicipalityItem对象。
以下是序列化的内容:
<CountyRollsTypeMunicipalityItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<RecordNumber xmlns="http://www.revenue.wi.gov/slf">1</RecordNumber>
一个问题是它说“CountyRollsTypeMunicipalityItem”而不是“Item” 第二个问题是它添加了命名空间属性 第三个问题是它将名称空间属性添加到Item下面的元素上。例如:
<CountyRollsTypeMunicipalityItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<RecordNumber xmlns="http://www.revenue.wi.gov/slf">1</RecordNumber>
<PropertyInfo xmlns="http://www.revenue.wi.gov/slf">
<LocalID1>002133010101</LocalID1>
我用这样的代码解决了第一个问题:
XmlRootAttribute myXmlRootAttribute = new XmlRootAttribute();
myXmlRootAttribute.ElementName = "Item";
XmlAttributes myXmlAttributes = new XmlAttributes();
myXmlAttributes.XmlRoot = myXmlRootAttribute;
XmlAttributeOverrides myXmlAttributeOverrides = new XmlAttributeOverrides();
myXmlAttributeOverrides.Add(typeof(CountyRollsTypeMunicipalityItem), myXmlAttributes);
XmlSerializer serializer = new XmlSerializer(typeof(CountyRollsTypeMunicipalityItem), myXmlAttributeOverrides);
serializer.Serialize(this.writer, item);
将标签更改为Item。但它仍然留下了命名空间属性。现在它开始将名称空间的东西添加到Item下面的2个元素:
<Item xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<RecordNumber>1</RecordNumber>
<PropertyInfo>
<LocalID1 xmlns="http://www.revenue.wi.gov/slf">002133010101</LocalID1>
然后我尝试在XmlSerializer上执行空名称空间技巧:
var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
serializer.Serialize(this.writer, item, emptyNamespaces);
但那给了我这个:
<Item xmlns="">
<RecordNumber>1</RecordNumber>
<PropertyInfo>
<LocalID1 xmlns="http://www.revenue.wi.gov/slf">002133010101</LocalID1>
我真正想要的是:
<Item>
<RecordNumber>1</RecordNumber>
<PropertyInfo>
<LocalID1>002133010101</LocalID1>