2016-03-01 2 views
0

Я создал классы из схемы XSD с помощью xsd.exe (также пытался с xsd2code, который имел лучшие результаты таким образом, что они работали немедленно, и с xsd.exe мне приходится отлаживать некоторые ошибки). XSD Schema, которую я использовал, можно найти по адресу http://www.landxml.org/schema/LandXML-1.2/LandXML-1.2.xsd, а файл-образец можно найти по адресу http://landxml.org/schema/LandXML-1.1/samples/AASHTO%20SDMS/MntnRoad.xml.Проблема странной десериализации

Мой код десериализации выглядит следующим образом:

var mySerializer = new XmlSerializer(typeof (LandXML), new XmlRootAttribute("")); 
TextReader myFileStream = new StreamReader("myFile.xml"); 
var myObject = (LandXML) mySerializer.Deserialize(myFileStream); 

Моя проблема заключается в том, что результат десериализации является список элементов типа XmlElement, так что если я пытаюсь получить доступ к их свойства, я не могу просто сделать это. Если я хочу получить доступ, например, некоторые из атрибутов объекта Alignment в myFile.xml, код похож на этот:

var a = myObject.Items[5]; 
var b = (XmlElement) a; 
var c = b.ChildNodes.Item(5).ChildNodes.Item(0).ChildNodes.Item(0).Attributes[0].Value; 

Очевидно, что это не путь, который предназначается, чтобы быть при десериализации XML в классы. Моя идея была как (для того же элемента):

var c = LandXML.Alignments.Alignment.CoordGeometry.Curve.rot 

Я не знаю, что я делаю неправильно, я попытался с более простыми схемами, и этот код работает хорошо. Пожалуйста, помогите и tnx заранее!

EDIT 1

это в верхней части моего класса, и я думаю, что это приносящих неприятности типа списка. И есть больше похож код в моих сгенерированных классов

public class LandXML 
    { 

     private List<object> _items; 

     private System.DateTime _date; 

     private System.DateTime _time; 

     private string _version; 

     private string _language; 

     private bool _readOnly; 

     private int _landXMLId; 

     private string _crc; 

     public LandXML() 
     { 
      this._items = new List<object>(); 
     } 

     [System.Xml.Serialization.XmlAnyElementAttribute()] 
     [System.Xml.Serialization.XmlElementAttribute("Alignments", typeof(Alignments))] 
     [System.Xml.Serialization.XmlElementAttribute("Amendment", typeof(Amendment))] 
     [System.Xml.Serialization.XmlElementAttribute("Application", typeof(Application))] 
     [System.Xml.Serialization.XmlElementAttribute("CgPoints", typeof(CgPoints))] 
     [System.Xml.Serialization.XmlElementAttribute("CoordinateSystem", typeof(CoordinateSystem))] 
     [System.Xml.Serialization.XmlElementAttribute("FeatureDictionary", typeof(FeatureDictionary))] 
     [System.Xml.Serialization.XmlElementAttribute("GradeModel", typeof(GradeModel))] 
     [System.Xml.Serialization.XmlElementAttribute("Monuments", typeof(Monuments))] 
     [System.Xml.Serialization.XmlElementAttribute("Parcels", typeof(Parcels))] 
     [System.Xml.Serialization.XmlElementAttribute("PipeNetworks", typeof(PipeNetworks))] 
     [System.Xml.Serialization.XmlElementAttribute("PlanFeatures", typeof(PlanFeatures))] 
     [System.Xml.Serialization.XmlElementAttribute("Project", typeof(Project))] 
     [System.Xml.Serialization.XmlElementAttribute("Roadways", typeof(Roadways))] 
     [System.Xml.Serialization.XmlElementAttribute("Surfaces", typeof(Surfaces))] 
     [System.Xml.Serialization.XmlElementAttribute("Survey", typeof(Survey))] 
     [System.Xml.Serialization.XmlElementAttribute("Units", typeof(Units))] 
     public List<object> Items 
     { 
      get 
      { 
       return this._items; 
      } 
      set 
      { 
       this._items = value; 
      } 
     } 

ответ

0

Попробуйте

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlSerializer xs = new XmlSerializer(typeof(LandXML)); 
      XmlTextReader reader = new XmlTextReader(FILENAME); 
      reader.Namespaces = false; 
      LandXML landXML = (LandXML)xs.Deserialize(reader); 
     } 
    } 

    [XmlRoot("LandXML")] 
    public class LandXML 
    { 
     [XmlAttribute("version")] 
     public double version { get;set; } 

     [XmlAttribute("date")] 
     public DateTime date { get;set; } 

     [XmlAttribute("time")] 
     public DateTime time { get; set; } 

     [XmlAttribute("readOnly")] 
     public Boolean readOnly { get;set; } 

     [XmlAttribute("language")] 
     public string language { get;set; } 

     [XmlElement("Project")] 
     public Project project { get; set; } 

     [XmlElement("Units")] 
     public Units units { get; set; } 

     [XmlElement("Application")] 
     public Application application { get; set; } 

     [XmlElement("Alignments")] 
     public Alignments alignments { get; set; } 
} 
    [XmlRoot("Project")] 
    public class Project 
    { 
     [XmlAttribute("name")] 
     public string name; 
    } 
    [XmlRoot("Units")] 
    public class Units 
    { 
     [XmlElement("Imperial")] 
     public Imperial imperial { get; set; } 
    } 
    [XmlRoot("Application")] 
    public class Application 
    { 
     [XmlElement("Author")] 
     public Author author { get; set; } 
    } 
    [XmlRoot("Imperial")] 
    public class Imperial 
    { 
     [XmlAttribute("linearUnit")] 
     public string linearUnit; 

     [XmlAttribute("areaUnit")] 
     public string areaUnit; 

     [XmlAttribute("volumeUnit")] 
     public string volumeUnit; 

     [XmlAttribute("temperatureUnit")] 
     public string temperaturUnit; 

     [XmlAttribute("pressureUnit")] 
     public string pressureUnit; 

     [XmlAttribute("angularUnit")] 
     public string angularUnit; 

     [XmlAttribute("directionUnit")] 
     public string name; 
    } 

    [XmlRoot("Author")] 
    public class Author 
    { 
     [XmlAttribute("createdBy")] 
     public string createdBy; 

     [XmlAttribute("createdByEmail")] 
     public string createdByEmail; 

     [XmlAttribute("company")] 
     public string company; 

     [XmlAttribute("companyURL")] 
     public string companyURL; 

    } 
    [XmlRoot("Alignments")] 
    public class Alignments 
    { 
     [XmlAttribute("desc")] 
     public string desc; 

     [XmlElement("Alignment")] 
     public Alignment alignment { get; set; } 

    } 

    [XmlRoot("Alignment")] 
    public class Alignment 
    { 
     [XmlAttribute("name")] 
     public string name; 

     [XmlAttribute("desc")] 
     public string desc; 

     [XmlAttribute("length")] 
     public string length; 

     [XmlAttribute("staStart")] 
     public string staStart; 

     [XmlElement("AlignPIs")] 
     public AlignPIs alignPIs { get; set; } 
    } 
    [XmlRoot("AlignPIs")] 
    public class AlignPIs 
    { 
     [XmlElement("AlignPI")] 
     public List<AlignPI> alignPI { get; set; } 
    } 

    [XmlRoot("AlignPI")] 
    public class AlignPI 
    { 
     [XmlElement("PI")] 
     public PI pi { get; set; } 

     [XmlElement("InSpiral")] 
     public InSpiral inSpiral { get; set; } 

     [XmlElement("Curve1")] 
     public Curve1 cureve1 { get; set; } 

     [XmlElement("OutSpiral")] 
     public OutSpiral outSpiral { get; set; } 

     [XmlElement("Station")] 
     public Station station { get; set; } 
    } 

    [XmlRoot("Station")] 
    public class Station 
    { 
     [XmlText] 
     public string value { get; set; } 
    } 


    [XmlRoot("PI")] 
    public class PI 
    { 
     [XmlAttribute("code")] 
     public int code; 

     [XmlAttribute("name")] 
     public int name; 

     [XmlText] 
     public string value; 
    } 

    [XmlRoot("InSpiral")] 
    public class InSpiral 
    { 
     [XmlElement("Spiral")] 
     public Spiral spiral { get; set; } 

    } 

    [XmlRoot("Spiral")] 
    public class Spiral 
    { 
     [XmlAttribute("length")] 
     public double length; 

     [XmlAttribute("radiusEnd")] 
     public double radiusEnd; 

     [XmlAttribute("radiusStart")] 
     public double radiusStart; 

     [XmlAttribute("rot")] 
     public string rot; 

     [XmlAttribute("spiType")] 
     public string spiType; 
    } 

    [XmlRoot("Curve1")] 
    public class Curve1 
    { 
     [XmlElement("Curve")] 
     public Curve curve { get; set; } 
    } 

    [XmlRoot("Curve")] 
    public class Curve 
    { 
     [XmlAttribute("rot")] 
     public string rot; 

     [XmlAttribute("radius")] 
     public double radius; 
    } 
    [XmlRoot("OutSpiral")] 
    public class OutSpiral 
    { 
     [XmlElement("Spiral")] 
     public Spiral spiral { get; set; } 
    } 
} 
+0

TNX за помощью, но это не работает - на самом деле он работает, но мой сгенерированный файл класса над 30k строки кода, и это огромная работа, чтобы вручную изменить все это. Основная проблема здесь в том, что у меня есть список , где хранятся другие объекты (например, Alignment), и я не могу получить к ним доступ напрямую, как я могу, если я сменил strucutre на ваш вид –

+0

Я добавил EDIT 1, чтобы лучше описать проблему –

+0

xml-файл может иметь только один корневой тег. У вас есть массив на корневом уровне. Изменение уровня совместимости может работать. Никогда не использовал его с де-сериализацией. строка FILENAME = ""; XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; XmlReader reader = XmlTextReader.Create (FILENAME, настройки); – jdweng

Смежные вопросы