CityGML反序列化问题

时间:2011-02-22 12:19:27

标签: c# xsd.exe xml-deserialization gml

我目前正在研究CityGML(de)序列化程序 - 我需要C#类来处理某些相应的对象 - 而且我遇到了一些麻烦 我需要System.Xml.Serialization.XmlSerializer实例的根类。我不知道大家对CityGML有多熟悉, 但这是对情况的描述。我还描述了我如何创建我的课程,如果你想跳过这个,你可以开始阅读 来自 / / *标记:

CityGML由几个.xsd文件组成,每个文件都是一个描述某种元素类型的模块(appearance.xsd,transports.xsd, building.xsd,vegetation.xsd等),还有一个根文件,CityGML.xsd。正如您所料,每个模块都需要元素 这个根文件。然后还有一个事实是CityGML实际上从GML继承了很多东西,因此从GML .xsd文件导入也是必要的。

到目前为止,就C#类生成而言,我尝试了两种方法,都使用经典的xsd.exe: - 创建一个.cs文件,其中包含我需要的所有CityGML类 - 一个命令行:

xsd gml/feature.xsd gml/xlinks.xsd gml/geometryBasic2d.xsd gml/geometryComplexes.xsd gml/geometryPrimitives.xsd gml/smil20.xsd
    gml/smil20-language.xsd citygml/xAL.xsd citygml/appearance.xsd citygml/building.xsd citygml/cityFurniture.xsd citygml/cityObjectGroup.xsd
    citygml/generics.xsd citygml/landUse.xsd citygml/relief.xsd citygml/texturedSurface.xsd citygml/transportation.xsd citygml/vegetation.xsd
    citygml/waterBody.xsd citygml/CityGML.xsd citygml/cityGMLBase.xsd /classes /fields /namespace:CityGML

- the creation of a .cs file for each of the CityGML modules - one command line for each module:

xsd citygml/xAL.xsd /classes /namespace:xAL /o:out

xsd gml/feature.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd
citygml/cityGMLBase.xsd /classes /namespace:CityGMLBase /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd
gml/xlinks.xsd citygml/appearance.xsd /classes /namespace:CityGMLAppearance /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd citygml/building.xsd /classes /namespace:CityGMLBuilding /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd citygml/cityFurniture.xsd /classes /namespace:CityGMLCityFurniture /o:out

xsd citygml/cityGMLBase.xsd gml/feature.xsd gml/xlinks.xsd citygml/xAL.xsd gml/geometryAggregates.xsd citygml/cityObjectGroup.xsd /classes /namespace:CityGMLCityObjectGroup /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd citygml/generics.xsd /classes /namespace:CityGMLGenerics /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd citygml/landUse.xsd /classes /namespace:CityGMLLandUse /o:out

xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/xlinks.xsd citygml/cityFurniture.xsd gml/coverage.xsd citygml/relief.xsd /classes /namespace:CityGMLRelief /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd citygml/texturedSurface.xsd /classes /namespace:CityGMLTexturedSurface /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryComplexes.xsd gml/xlinks.xsd citygml/transportation.xsd /classes /namespace:CityGMLTransportation /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd 
gml/xlinks.xsd citygml/vegetation.xsd /classes /namespace:CityGMLVegetation /o:out

xsd gml/feature.xsd citygml/cityGMLBase.xsd citygml/xAL.xsd gml/geometryAggregates.xsd gml/xlinks.xsd citygml/waterBody.xsd /classes /namespace:CityGMLWaterBody /o:out

对于每个命令,最后一个.xsd是所需的模块,而其他命令是必需的导入。

不幸的是,虽然xsd.exe处理来自其他.xsd文件的导入,但它创建了所需文件的类以及导入的类 文件,它完全“直接”,将所有这些类堆叠在一个.cs文件中。显然,没有办法分开所需的课程 来自不同.cs文件中的导入类。 因此,我的第一个问题是是否有任何(DE)序列化工具,类似于XSD.EXE,与进口的.XSD文件的交易 并创建一个.CS文件层次结构?这将避免重复例如所有上述模块中的feature.xsd类 .cs文件。

/ / *

继续,实际上导致我麻烦的问题与XmlSerializer实例有关,由于基础CityGML无法创建 对象类型,CityModelType,它也是整个层次结构中的根类,并不完全有效:

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(CityModelType));

这个赋值首先产生了一个错误,关于使用XmlTextAttribute定义一个string [],它呈现了CityModelType的“反射” 不可能。我用XmlAttributeAttribute和当前消息替换了XmlTextAttribute,这些消息的来源我无法跟踪, 是这些(是的,我用法语工作):

System.InvalidOperationException: Impossible de générer une classe temporaire (result=1).
error CS0030: Impossible de convertir le type 'CityGML.LineStringSegmentType[]' en 'CityGML.LineStringSegmentType'
error CS0030: Impossible de convertir le type 'CityGML.LineStringSegmentType[]' en 'CityGML.LineStringSegmentType'
error CS0030: Impossible de convertir le type 'CityGML.LineStringSegmentType[]' en 'CityGML.LineStringSegmentType'
error CS0029: Impossible de convertir implicitement le type 'CityGML.LineStringSegmentType' en 'CityGML.LineStringSegmentType[]'
error CS0029: Impossible de convertir implicitement le type 'CityGML.LineStringSegmentType' en 'CityGML.LineStringSegmentType[]'
error CS0029: Impossible de convertir implicitement le type 'CityGML.LineStringSegmentType' en 'CityGML.LineStringSegmentType[]'

首先,LineStringSegmentType的唯一出现与曲线有关,我没有在我的.gml文件中使用。它们的定义如下:

    public partial class LineStringSegmentType : AbstractCurveSegmentType {

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("coordinates", typeof(CoordinatesType))]
        [System.Xml.Serialization.XmlElementAttribute("pointProperty", typeof(PointPropertyType))]
        [System.Xml.Serialization.XmlElementAttribute("pointRep", typeof(PointPropertyType))]
        [System.Xml.Serialization.XmlElementAttribute("pos", typeof(DirectPositionType))]
        [System.Xml.Serialization.XmlElementAttribute("posList", typeof(DirectPositionListType))]
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
        public object[] Items;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public ItemsChoiceType2[] ItemsElementName;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public CurveInterpolationType interpolation;

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool interpolationSpecified;

        public LineStringSegmentType() {
            this.interpolation = CurveInterpolationType.linear;
        }
    }

......他们在这里使用:

public partial class TinType : TriangulatedSurfaceType {

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("LineStringSegment", typeof(LineStringSegmentType), IsNullable=false)]
    public LineStringSegmentType[][] stopLines;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("LineStringSegment", typeof(LineStringSegmentType), IsNullable=false)]
    public LineStringSegmentType[][] breakLines;

    /// <remarks/>
    public LengthType maxLength;

    /// <remarks/>
    public TinTypeControlPoint controlPoint;
}

...来自这个gml:geometryPrimitives.xsd片段:

<complexType name="TinType">
    [...]
    <complexContent>
        <extension base="gml:TriangulatedSurfaceType">
            <sequence>
                <element name="stopLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded">
                    [...]
                </element>
                <element name="breakLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded">
                    [...]
                </element>
                <element name="maxLength" type="gml:LengthType">
                    [...]
                </element>
                <element name="controlPoint">
                    [...]
                    <complexType>
                        <choice>
                            <element ref="gml:posList"/>
                            <group ref="gml:geometricPositionGroup" minOccurs="3" maxOccurs="unbounded"/>
                        </choice>
                    </complexType>
                </element>
            </sequence>
        </extension>
    </complexContent>
</complexType>

<complexType name="LineStringSegmentArrayPropertyType">
    <sequence>
        <element ref="gml:LineStringSegment" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
</complexType>

我看不出问题出在哪里,这很奇怪。希望早日收到你的消息。感谢。

干杯, 维克多

1 个答案:

答案 0 :(得分:1)

“是否有任何(DE)序列化工具,类似于XSD.EXE,与进口的.XSD文件进行交易并创建一个.CS文件层次结构?”

是的确,我使用了Xsd2Code,这是我遇到类似问题之后发送的一封神xtd.exe