C#将所有内容反序列化为anyField

时间:2016-05-04 08:58:52

标签: c# xsd xml-serialization

我正在开发一个C#项目,我需要读取和编写xml文件。因此,我使用第三方开源xml架构。由于此模式中的某些xsd元素对非特定于模式的扩展是开放的,因此它们提供了所谓的“anyField”子元素,如下所示:

<xs:complexType name="eTrackElements">
  <xs:sequence>
    ...
    <xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded">
    </xs:any>
    ...
  </xs:sequence>
</xs:complexType>

我已经使用xsd.exe以这种方式成功生成了我的C#代码:

xsd.exe %XSD_IN% /c /language:CS /order /n:RailMLlib22 /o:%CS_OUT%

使用该代码,我创建了一个对象结构,并且我能够将其编写/序列化为有效的XML文件。但是当我尝试将这个或任何其他(有效的)xml文件读取/反序列化到对象树中时,“eTrackElements”中的所有元素都没有落在它们被假定的位置,它们都被反序列化为“anyField”,尽管它们都是不是特殊/扩展的,它们位于相同的命名空间中,它们是该xml架构的标准元素。 我可以阻止此行为的唯一方法是在我生成的C#代码中注释掉anyField:

// private System.Xml.XmlElement[] anyField;

然后一切正常!但这是一个糟糕的解决方法,我怎样才能更好地解决这个问题呢?

由于代码是25k行代码,这可能是相关部分:

  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
  [System.SerializableAttribute()]
  [System.Diagnostics.DebuggerStepThroughAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.railml.org/schemas/2013")]
  public partial class eTrackElements {
  ...
    private tSpeedChange[] speedChangesField;
    ...
    private System.Xml.XmlElement[] anyField;
    ...

    [System.Xml.Serialization.XmlArrayAttribute(Order = 0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("speedChange", IsNullable = false)]
    public tSpeedChange[] speedChanges
    {
      get
      {
        return this.speedChangesField;
      }
      set
      {
        this.speedChangesField = value;
      }
    }

    ...

    [System.Xml.Serialization.XmlAnyElementAttribute(Order = 17)]
    public System.Xml.XmlElement[] Any
    {
      get
      {
        return this.anyField;
      }
      set
      {
        this.anyField = value;
     }
    }

示例xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<railml xmlns:purl="http://purl.org/dc/elements/1.1/" xmlns="http://www.railml.org/schemas/2013">
    <infrastructure>
        <tracks>
            <track type="mainTrack1" id="t1">
                <trackTopology>
                    <trackBegin id="t1start" pos="0">
                        <connection id="c1" ref="c2"/>
                    </trackBegin>
                    <trackEnd id="t1end" pos="1306">
                        <connection id="c3" ref="c4"/>
                    </trackEnd>
                    <connections>
                        <switch pos="1306" id="sw196">
                            <connection course="right" orientation="outgoing" id="5" ref="6"/>
                        </switch>
                    </connections>
                    <crossSections>
                        <crossSection ocpRef="OCP1" pos="332" id="cs1">
                            <geoCoord coord="..."/>
                        </crossSection>
                        <crossSection ocpRef="OCP2" pos="810" id="cs2">
                            <geoCoord coord="..."/>
                        </crossSection>
                        <crossSection ocpRef="OCP3" pos="1279" id="cs3">
                            <geoCoord coord="..."/>
                        </crossSection>
                    </crossSections>
                </trackTopology>
                <trackElements>
                    <gradientChanges>
                        <gradientChange slope="0" pos="0" id="gr1"/>
                        <gradientChange slope="2" pos="329" id="gr2"/>
                        <gradientChange slope="3" pos="808" id="gr3"/>
                        <gradientChange slope="4" pos="1299" id="gr4"/>
                        <gradientChange slope="4" pos="1306" id="gr5"/>
                    </gradientChanges>
                </trackElements>
            </track>
        </tracks>
    </infrastructure>
</railml>

我以这种方式导入xml文件:

  RailMLlib22.railml railML22 = null;
  FileStream file = null;
  try
  {
    file = new FileStream(filename, FileMode.Open);
    railML22 = (RailMLlib22.railml)new XmlSerializer(typeof(RailMLlib22.railml)).Deserialize(file);
  }
  catch (Exception exc)
  {
    ...
  }
  finally
  {
    file.Close();
  }

0 个答案:

没有答案