我正在开发一个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();
}