簡體   English   中英

在C#中反序列化XML時出錯

[英]Error deserializing XML in C#

這是我在C#中反序列化的代碼:

private void button1_Click(object sender, EventArgs e)
    {
        LandXML myObject;
        XmlSerializer mySerializer =
        new XmlSerializer(typeof(LandXML));
        FileStream myFileStream =
        new FileStream("Nova 6.xml", FileMode.Open);
        myObject = (LandXML)
        mySerializer.Deserialize(myFileStream);
    }

我使用Visual Studio的工具xsd.exe從鏈接http://www.landxml.org/schema/LandXML-1.2/LandXML-1.2.xsd生成了類。 我有一些基於LandXML Schema的通用文件(XSD和XML文件在http://www.utilities-online.info/xsdvalidation/#.VtBcNeaT6YA上檢查兼容性,它們是兼容的)。 問題是我的代碼永遠不會超越:

XmlSerializer mySerializer =
    new XmlSerializer(typeof(LandXML));

我收到一個錯誤(這只是錯誤跟蹤的一部分)

'TunnelCore.Utilities.LandXML12.LandXML'。 System.InvalidOperationException:存在反映類型“TunnelCore.Utilities.LandXML12.LandXML”的錯誤。 ---> System.InvalidOperationException:反映屬性'Items'時出錯。 ---> System.InvalidOperationException:有一個錯誤反映了類型'TunnelCore.Utilities.LandXML12.PlanFeatures'。 ---> System.InvalidOperationException:反映屬性'PlanFeature'時出錯。 ---> System.InvalidOperationException:有一個錯誤反映了類型'TunnelCore.Utilities.LandXML12.PlanFeature'。 ---> System.InvalidOperationException:反映屬性'Items'時出錯。 ---> System.InvalidOperationException:有一個錯誤反映了類型'TunnelCore.Utilities.LandXML12.CoordGeom'。 ---> System.InvalidOperationException:反映屬性'Items'時出錯。 ---> System.InvalidOperationException:有一個錯誤反映了類型'TunnelCore.Utilities.LandXML12.IrregularLine'。 ---> System.InvalidOperationException:反映屬性'Item'時出錯。 ---> System.InvalidOperationException:可能沒有為基本類型指定XmlElement的類型。 在System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping訪問器,FieldModel模型,XmlAttributes a,String ns,Type choiceIdentifierType,Boolean rpc,Boolean openModel,RecursionLimiter limiter)處於System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent,FieldModel) System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping,StructModel model,Boolean openModel,String typeName,RecursionLimiter limiter)中的model,XmlAttributes a,String ns,RecursionLimiter limiter)---內部異常堆棧跟蹤結束--- at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping的System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping,StructModel model,Boolean openModel,String typeName,RecursionLimiter limiter)(StructModel model,String ns,Boolean openModel,XmlAttributes a,RecursionLimiter limiter) )在System.Xml.Serialization.XmlReflectionImport er.ImportTypeMapping(TypeModel model,String ns,ImportContext context,String dataType,XmlAttributes a,Boolean repeats,Boolean openModel,RecursionLimiter limiter)

我是編程新手,但我認為這部分可能至關重要:

... System.InvalidOperationException:可能未為基本類型指定XmlElement的類型。

有人可以幫助解析並正確創建這個類。 用於測試的示例XML文件可在以下位置找到:

http://landxml.org/schema/LandXML-1.1/samples/TopoCAD/Alignments%20and%20length%20table.xml

按照您的步驟創建類並將不規則的線類與Boundary類進行比較,因為兩者都有一個只有2個項PntList2d / 3d的選項。

對於不規則線

    [System.Xml.Serialization.XmlElementAttribute("PntList2D", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("PntList3D", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
    public double Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemChoiceType ItemElementName {
        get {
            return this.itemElementNameField;
        }
        set {
            this.itemElementNameField = value;
        }
    }

而對於邊界

    [System.Xml.Serialization.XmlElementAttribute("PntList2D", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("PntList3D", typeof(string))]
    public object Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }

我相信你的問題是不規則的行項目字段是雙重的,而Item的返回類型也是雙重的。

將兩者都更改為object將消除錯誤

但是你有更多錯誤......

請注意,邊界沒有

[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]

它也沒有

private ItemChoiceType itemElementNameField;

/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public ItemChoiceType ItemElementName {
    get {
        return this.itemElementNameField;
    }
    set {
        this.itemElementNameField = value;
    }
}

您還需要在幾個不同的區域添加這些(它會告訴您在哪里)。 關於錯誤是至關重要的,你是對的。 您需要進行更改的每個位置都位於這些嵌套內部異常的底部。 繼續工作,可能會出現一些錯誤,只有在你擺脫錯誤之前才會出現這些錯誤。 顯然xsd.exe在選擇上犯了一些錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM