序列化Xsd.exe生成的一部分类,想要省略xmlns属性

时间:2013-07-23 22:14:39

标签: xml serialization

我需要创建一个包含大量数据的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>

0 个答案:

没有答案