Конвертировать XML в объект C # - PullRequest
0 голосов
/ 16 октября 2019

У меня возникают трудности при попытке конвертировать мой XML в объект C #. Это должно быть сделано динамически. Я думаю, что проблема существует где-то в классе объектов c #.

XML

           <Sites>
                <PostCodeValidatedSite>
                    <Address>
                        <ALK>A00067262524</ALK>
                        <BuildingName>1 The Pavilions</BuildingName>
                        <CSSDistrictCode>CM</CSSDistrictCode>
                        <ExchangeCode>SOL</ExchangeCode>
                        <IsPostCodeValid>true</IsPostCodeValid>
                        <Locality>Shirley</Locality>
                        <PostCode>B90 4SB</PostCode>
                        <PostTown>Solihull</PostTown>
                        <Qualifier>Gold</Qualifier>
                        <Street>Cranmore Drive</Street>
                        <Technologies>
                            <Technology>
                                <IsAssociated>true</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>Copper</Name>
                            </Technology>
                            <Technology>
                                <IsAssociated>true</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>PointToPointFibre</Name>
                            </Technology>
                            <Technology>
                                <IsAssociated>false</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>FTTPBrownfield</Name>
                            </Technology>
                            <Technology>
                                <IsAssociated>false</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>FTTPGreenfield</Name>
                            </Technology>
                        </Technologies>
                    </Address>
                    <Coordinates>
                        <Easting>413358</Easting>
                        <Latitude>52.39657</Latitude>
                        <Longitude>-1.79875</Longitude>
                        <Northing>278082</Northing>
                    </Coordinates>
                </PostCodeValidatedSite>


                <PostCodeValidatedSite>
                    <Address>
                        <ALK>A15100427347</ALK>
                        <BuildingName>1 The Pavilions</BuildingName>
                        <CSSDistrictCode>CM</CSSDistrictCode>
                        <ExchangeCode>SOL</ExchangeCode>
                        <IsPostCodeValid>true</IsPostCodeValid>
                        <Locality>Shirley</Locality>
                        <PostCode>B90 4SB</PostCode>
                        <PostTown>Solihull</PostTown>
                        <Qualifier>Gold</Qualifier>
                        <Street>Cranmore Drive</Street>
                        <SubBuilding>Floor 001-Room Comm</SubBuilding>
                        <Technologies>
                            <Technology>
                                <IsAssociated>false</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>Copper</Name>
                            </Technology>
                            <Technology>
                                <IsAssociated>true</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>PointToPointFibre</Name>
                            </Technology>
                            <Technology>
                                <IsAssociated>false</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>FTTPBrownfield</Name>
                            </Technology>
                            <Technology>
                                <IsAssociated>false</IsAssociated>
                                <IsRestricted>false</IsRestricted>
                                <Name>FTTPGreenfield</Name>
                            </Technology></Technologies>
                    </Address>
                    <Coordinates>
                        <Easting>413358</Easting>
                        <Latitude>52.39657</Latitude>
                        <Longitude>-1.79875</Longitude>
                        <Northing>278082</Northing>
                    </Coordinates>
                </PostCodeValidatedSite>
            </Sites>

Код сериализации:

 string Outerxml = xmlToFormat.FirstChild.FirstChild.FirstChild.FirstChild.LastChild.FirstChild.FirstChild.OuterXml;
        string formatedXml = XmlFormatter.RemoveXmlns(Outerxml);

        List<Address> result = new List<Address>(); ;

        // Deserialises xlm into an object 
        XmlSerializer serializer = new XmlSerializer(typeof(List<Address>), new XmlRootAttribute("Address"));
        using (TextReader reader = new StringReader(formatedXml))
        {
            result = (List<Address>)serializer.Deserialize(reader);
        }

        return result;

Мой объект Класс:

public class Address
{
    [XmlElement("ALK")]
    public string ALK { get; set; }

    [XmlElement("BuildingName")]
    public string BuildingName { get; set; }

    [XmlElement("CSSDistrictCode")]
    public string CSSDistrictCode { get; set; }

    [XmlElement("IsPostCodeValid")]
    public Boolean IsPostCodeValid { get; set; }

    [XmlElement("Locality")]
    public string Locality { get; set; }

    [XmlElement("PostCode")]
    public string PostCode { get; set; }

    [XmlElement("PostTown")]
    public string PostTown { get; set; }

    [XmlElement("Qualifier")]
    public string Qualifier { get; set; }

    [XmlElement("Street")]
    public string Street { get; set; }
}

}

На данный момент я не получаю никаких ошибок, просто пустой массив. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

1 Ответ

1 голос
/ 16 октября 2019

Добавить следующие классы

[Serializable, XmlRoot("Sites")]
public class Sites
{
    [XmlElement("PostCodeValidatedSite")]
    public List<PostCodeValidatedSite> PostCodeValidatedSites { get; set; }
}

public class PostCodeValidatedSite
{
    public Address Address { get; set; }
}

Затем десериализовать его таким образом

XmlSerializer serializer = new XmlSerializer(typeof(Sites));
using (TextReader reader = new StringReader(formatedXml))
{
    var result = (Sites)serializer.Deserialize(reader);
}

PS: я не добавил декларацию Coordinates, так как вы интересовались только Address данных, в противном случае объявите их так же, как вы сделали с Address, и добавьте их в класс PostCodeValidatedSite.

...