0

我需要创建一个包含大量数据的 XML 文件。

这是标签结构的高级视图(为了清楚起见,我省略了很多标签)。

<CountyRolls>
    <Municipality>
        <Item>
            <PropertyInfo>
            </PropertyInfo>                
        </Item>
    </Municipality>
</CountyRolls>

CountyRolls是我的根元素。
自治市是一个重复的元素,可能会出现大约 1 到 25 次。
项目是一个重复元素,可能重复数十万次。
PropertyInfo是 Item 下面的元素示例。

为了节省一些工作,我利用 XSD.exe 程序从 XML 模式定义文件生成类。它创建了如下类:

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 下面 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>
4

0 回答 0