.NET 4.x Как использовать xsd файлы при десериализации xml для получения значений элементов? - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Для личных нужд по работе пишу программку для конвертирования xml, получаемых с сайта росреестра (Кадастровый план территории - далее КПТ), в чертеж dwg. На сайте росреестра нашел xml-схемы. Скачал - в архиве находятся три папки с файлами с расширением .xsd. Гуглив данный вопрос выяснил, что это описание структуры xml-файлов. Использовал утилиту xsd2code++ и получил класс для работы с КПТ. В классе заданы все нужные типы, согласно схемам xsd Далее, использую десириализацию xml-файла и получаю экземпляр класса КПТ:
// Десириализация документа в КПТ версии 10
private static KPTv10.KPT DeserializeXmlToKPTv10(string fileName)
{
    var formatter = new XmlSerializer(typeof(KPTv10.KPT));
    using (var fs = new FileStream(fileName, FileMode.Open))
    {
        var kpt = formatter.Deserialize(fs) as KPTv10.KPT;
        return kpt;
    }
}
Все хорошо - все работает без ошибок и нареканий Однако, начав копать глубже, выяснил следующее: Вот пример куска xml-файла, получаемого с сайта росреестра:
<Parcel CadastralNumber="66:22:0502003:38" State="06" DateCreated="2010-03-17">
    <Area>
        <Area>58040</Area>
        <Unit>055</Unit>
        <Inaccuracy>795</Inaccuracy>
    </Area>
    <Name>05</Name>
    <Location>
        <Address>
            <adrOut4:OKATO>65236000000</adrOut4:OKATO>
            <adrOut4:KLADR>6602100000000</adrOut4:KLADR>
            <adrOut4:Region>66</adrOut4:Region>
            <adrOut4:District Name="Режевской" Type="р-н" />
После десериализации я получаю экземпляр класса КПТ, у которого значение параметра (к примеру) Name = Item05 В классе KPT у меня есть такое:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1064.2")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn://x-artefacts-rosreestr-ru/commons/directories/parcels/1.0.1")]
public enum dParcels
{
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("01")]
    Item01,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("02")]
    Item02,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("03")]
    Item03,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("04")]
    Item04,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("05")]
    Item05,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("06")]
    Item06,
}
А файл xsd выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dParc1="urn://x-artefacts-rosreestr-ru/commons/directories/parcels/1.0.1" targetNamespace="urn://x-artefacts-rosreestr-ru/commons/directories/parcels/1.0.1" elementFormDefault="qualified">
    <xs:simpleType name="dParcels">
        <xs:annotation>
            <xs:documentation>Вид земельного участка.</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="01">
                <xs:annotation>
                    <xs:documentation>Землепользование</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="02">
                <xs:annotation>
                    <xs:documentation>Единое землепользование 
            </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="03">
                <xs:annotation>
                    <xs:documentation>Обособленный участок
            </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="04">
                <xs:annotation>
                    <xs:documentation>Условный участок
            </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="05">
                <xs:annotation>
                    <xs:documentation>Многоконтурный участок</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="06">
                <xs:annotation>
                    <xs:documentation>Значение отсутствует</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>
Вопрос - как правильно мне сделать, чтобы при десириализации xml-файла в значении параметра Name я получал не enum, а сразу значение, описанное в xsd-файле? Если есть эти файлы, значит наверняка их можно использовать прям в самом коде моей программы и не изобретать велосипед? З.Ы. Может просто xsd2code++ мне неверно создает класс?

Решение задачи: «.NET 4.x Как использовать xsd файлы при десериализации xml для получения значений элементов?»

textual
Листинг программы
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dAb1="urn://x-artefacts-rosreestr-ru/commons/directories/ass-building/1.0.1" targetNamespace="urn://x-artefacts-rosreestr-ru/commons/directories/ass-building/1.0.1" elementFormDefault="qualified">
    <xs:simpleType name="dAssBuilding">
        <xs:annotation>
            <xs:documentation>Назначение зданий</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="204001000000">
                <xs:annotation>
                    <xs:documentation>Нежилое здание</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="204002000000">
                <xs:annotation>
                    <xs:documentation>Жилой дом</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="204003000000">
                <xs:annotation>
                    <xs:documentation>Многоквартирный дом</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.357 из 5
Похожие ответы