Разбор XSD
От: Аноним  
Дата: 18.03.14 21:07
Оценка:
Здравствуйте.

Надо выбрать из xsd простые элементы (element), т.е. не complexType.
Пример:


<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:cite="http://www.opengeospatial.net/cite" xmlns:gml="http://www.opengis.net/gml" xmlns:it.geosolutions="http://www.geo-solutions.it" xmlns:nurc="http://www.nurc.nato.int" xmlns:sde="http://geoserver.sf.net" xmlns:sf="http://www.openplans.org/spearfish" xmlns:tiger="http://www.census.gov" xmlns:topp="http://www.openplans.org/topp" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.census.gov">
  <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://localhost:8090/geoserver/schemas/gml/3.1.1/base/gml.xsd"/>
  <xsd:complexType name="poly_landmarksType">
    <xsd:complexContent>
      <xsd:extension base="gml:AbstractFeatureType">
        <xsd:sequence>
          <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
          <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>
          <xsd:element maxOccurs="1" minOccurs="0" name="CFCC" nillable="true" type="xsd:string"/>
          <xsd:element maxOccurs="1" minOccurs="0" name="LANAME" nillable="true" type="xsd:string"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>
</xsd:schema>


Т.е. на выходе я хочу получить следующие элементы (разобранный комплексный элемент poly_landmarks):

  • the_geom
  • LAND
  • CFCC
  • LANAME

    Сама схема хранится в XmlSchema, но ее также можно загрузить в любой другой подходящий для разбора класс.

    Поправьте меня, если я не совсем корректно поставил вопрос.
    Спасибо.
  • Re: Разбор XSD
    От: koodeer  
    Дата: 19.03.14 07:25
    Оценка:
    Здравствуйте, Аноним.

    Загружаем xml в XDocument. Получаем коллекцию потомков. Выводим все атрибуты.

    var text = @"<?xml version=""1.0"" encoding=""UTF-8""?><xsd:schema xmlns:cite=""http://www.opengeospatial.net/cite"" xmlns:gml=""http://www.opengis.net/gml"" xmlns:it.geosolutions=""http://www.geo-solutions.it"" xmlns:nurc=""http://www.nurc.nato.int"" xmlns:sde=""http://geoserver.sf.net"" xmlns:sf=""http://www.openplans.org/spearfish"" xmlns:tiger=""http://www.census.gov"" xmlns:topp=""http://www.openplans.org/topp"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" elementFormDefault=""qualified"" targetNamespace=""http://www.census.gov"">
      <xsd:import namespace=""http://www.opengis.net/gml"" schemaLocation=""http://localhost:8090/geoserver/schemas/gml/3.1.1/base/gml.xsd""/>
      <xsd:complexType name=""poly_landmarksType"">
        <xsd:complexContent>
          <xsd:extension base=""gml:AbstractFeatureType"">
            <xsd:sequence>
              <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""the_geom"" nillable=""true"" type=""gml:MultiSurfacePropertyType""/>
              <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""LAND"" nillable=""true"" type=""xsd:double""/>
              <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""CFCC"" nillable=""true"" type=""xsd:string""/>
              <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""LANAME"" nillable=""true"" type=""xsd:string""/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
      <xsd:element name=""poly_landmarks"" substitutionGroup=""gml:_Feature"" type=""tiger:poly_landmarksType""/>
    </xsd:schema>";
    
    var xml = XDocument.Parse(text);
    XNamespace ns = "http://www.w3.org/2001/XMLSchema";
    
    var elems = xml.Descendants(ns + "element"); // коллекция всех узлов element
    
    foreach (var elem in elems)
    {
        foreach (var attr in elem.Attributes()) // все атрибуты
            Console.WriteLine(attr);
        Console.WriteLine();
    }


    Или получаем конкретный элемент и конкретный атрибут.

    var poly_landmarks = xml.Root.Element(ns + "complexType");
    
    foreach (var elem in poly_landmarks.Descendants(ns + "element"))
    {
        Console.WriteLine(elem.Attribute("name").Value);
    }
    Re[2]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 07:47
    Оценка:
    Здравствуйте, koodeer, Вы писали:

    K>Здравствуйте, Аноним.


    K>Загружаем xml в XDocument. Получаем коллекцию потомков. Выводим все атрибуты.


    K>
    K>var text = @"<?xml version=""1.0"" encoding=""UTF-8""?><xsd:schema xmlns:cite=""http://www.opengeospatial.net/cite"" xmlns:gml=""http://www.opengis.net/gml"" xmlns:it.geosolutions=""http://www.geo-solutions.it"" xmlns:nurc=""http://www.nurc.nato.int"" xmlns:sde=""http://geoserver.sf.net"" xmlns:sf=""http://www.openplans.org/spearfish"" xmlns:tiger=""http://www.census.gov"" xmlns:topp=""http://www.openplans.org/topp"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" elementFormDefault=""qualified"" targetNamespace=""http://www.census.gov"">
    K>  <xsd:import namespace=""http://www.opengis.net/gml"" schemaLocation=""http://localhost:8090/geoserver/schemas/gml/3.1.1/base/gml.xsd""/>
    K>  <xsd:complexType name=""poly_landmarksType"">
    K>    <xsd:complexContent>
    K>      <xsd:extension base=""gml:AbstractFeatureType"">
    K>        <xsd:sequence>
    K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""the_geom"" nillable=""true"" type=""gml:MultiSurfacePropertyType""/>
    K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""LAND"" nillable=""true"" type=""xsd:double""/>
    K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""CFCC"" nillable=""true"" type=""xsd:string""/>
    K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""LANAME"" nillable=""true"" type=""xsd:string""/>
    K>        </xsd:sequence>
    K>      </xsd:extension>
    K>    </xsd:complexContent>
    K>  </xsd:complexType>
    K>  <xsd:element name=""poly_landmarks"" substitutionGroup=""gml:_Feature"" type=""tiger:poly_landmarksType""/>
    K></xsd:schema>";
    
    K>var xml = XDocument.Parse(text);
    K>XNamespace ns = "http://www.w3.org/2001/XMLSchema";
    
    K>var elems = xml.Descendants(ns + "element"); // коллекция всех узлов element
    
    K>foreach (var elem in elems)
    K>{
    K>    foreach (var attr in elem.Attributes()) // все атрибуты
    K>        Console.WriteLine(attr);
    K>    Console.WriteLine();
    K>}
    K>


    В этом варианте 2 проблемы:
    1) Вы получаете не только element, но и element, который является complexType.

    вывод должен быть таким:
  • the_geom
  • LAND
  • CFCC
  • LANAME

    у вас:
  • the_geom
  • LAND
  • CFCC
  • LANAME
  • poly_landmarks

    2) Namespace неизвестен при разборе.

    K>Или получаем конкретный элемент и конкретный атрибут.


    K>
    K>var poly_landmarks = xml.Root.Element(ns + "complexType");
    
    K>foreach (var elem in poly_landmarks.Descendants(ns + "element"))
    K>{
    K>    Console.WriteLine(elem.Attribute("name").Value);
    K>}
    K>


    При таком подходе мы пропускаем возможные element в корне (не относится к приведенному примеру, там в корне только complexType).
    Ну и опять же мы не знаем Namespace.
  • Re[3]: Разбор XSD
    От: koodeer  
    Дата: 19.03.14 10:07
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>В этом варианте 2 проблемы:

    А>1) Вы получаете не только element, но и element, который является complexType.

    Я и написал: получаем все элементы и все атрибуты.
    Если нужен конкретный элемент и конкретный атрибут — используем второй пример.

    А>2) Namespace неизвестен при разборе.


    Какой неймспейс? xmlns:xsd="http://www.w3.org/2001/XMLSchema" известен всегда, потому что это стандартный неймспейс xml-схемы. А другие не используются в моём примере.


    А>При таком подходе мы пропускаем возможные element в корне (не относится к приведенному примеру, там в корне только complexType).


    Я не умею читать мысли. Нужно получить ещё какие-то элементы — добавляем код их получения.
    Re: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 11:25
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Поправьте меня, если я не совсем корректно поставил вопрос.

    Я так понимаю, вы хотите найти все элементы (не важно на какой глубине вложенности в описании схемы они лежат), которые подпадают под некоторый критерий.

    Но вот, какой это критерий, я не совсем понял.
    Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType, но вы хотите, чтобы в выборку попал и элемент the_geom, у которого тип gml:MultiSurfacePropertyType, а этот тип (если посмотреть в схему для пространства http://www.opengis.net/gml) является тоже ComplexType.

    Поэтому, уточните, пожалуйста критерий отбора.
    Re[2]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 11:42
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType,

    Ну и собственно вот мой вариант решения для этой задачи.
    В принципе, там уже достаются все элементы (хотя надо будет внимательно пересмотреть, все ли варианты типов объектов, которые могут содержать элементы я проверяю), осталось только наложить правильный критерий (заранее прошу прощеня за неслишком опрятный стиль — это наскоряк написанный вариант).
    К сожалению более простого варианта обхода дерева схемы я не знаю. Только такой вот рукопашный

    public void Sample()
    {
        var schema = XmlSchema.Read(new FileStream("MyScheme.xsd", FileMode.Open), null);
        var schemaSet = new XmlSchemaSet();
    
        schemaSet.Add(schema);
        schemaSet.Compile();
    
        var elements = GetElements(schema.Items);
    
        var simpleElements = elements.Where(t => t.ElementSchemaType is XmlSchemaSimpleType);
    
        foreach (var e in simpleElements)
        {
            Console.WriteLine(e.Name);
        }
    
    }
    
    public List<XmlSchemaElement> GetElements(XmlSchemaObjectCollection objectCollection)
    {
        var result = new List<XmlSchemaElement>();
    
        foreach (var obj in objectCollection)
        {
            if (obj is XmlSchemaAnnotated)
            {
                if (obj is XmlSchemaContent)
                    result.AddRange(GetElements(obj as XmlSchemaContent));
                else if (obj is XmlSchemaContentModel)
                    result.AddRange(GetElements((obj as XmlSchemaContentModel).Content));
                else if (obj is XmlSchemaGroup)
                    result.AddRange(GetElements((obj as XmlSchemaGroup).Particle));
                else if (obj is XmlSchemaParticle)
                    result.AddRange(GetElements(obj as XmlSchemaParticle));
                else if (obj is XmlSchemaComplexType)
                {
                    var complexType = obj as XmlSchemaComplexType;
                    if (complexType.ContentModel != null)
                        result.AddRange(GetElements(complexType.ContentModel.Content));
    
                    if (complexType.Particle != null)
                        result.AddRange(GetElements(complexType.Particle));
                }
            }
        }
    
        return result;
    }
    
    public List<XmlSchemaElement> GetElements(XmlSchemaContent content)
    {
        if (content is XmlSchemaComplexContentExtension)
            return GetElements((content as XmlSchemaComplexContentExtension).Particle);
    
        if (content is XmlSchemaComplexContentRestriction)
            return GetElements((content as XmlSchemaComplexContentRestriction).Particle);
    
        return new List<XmlSchemaElement>();
    }
    
    public List<XmlSchemaElement> GetElements(XmlSchemaParticle particle)
    {
        if (particle is XmlSchemaElement)
            return new List<XmlSchemaElement> { particle as XmlSchemaElement };
    
        if (particle is XmlSchemaGroupBase)
            return GetElements((particle as XmlSchemaGroupBase).Items);
    
        return new List<XmlSchemaElement>();
    }
    Re[3]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 11:53
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Михаил Романов, Вы писали:


    МР>>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType,

    МР>Ну и собственно вот мой вариант решения для этой задачи.
    Да, совсем забыл — мне пришлось немного поменять исходную XSD, т.к. для компиляции схемы в XmlSchemaSet нужны все подключаемые схемы тоже, то я указал вместо локального сервера исходный (ну и если у вас будут использованы дополнительные схемы их нужно или явно добавить руками или указать импорт и откуда загружать):
    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:cite="http://www.opengeospatial.net/cite" 
                xmlns:gml="http://www.opengis.net/gml" 
                xmlns:it.geosolutions="http://www.geo-solutions.it" 
                xmlns:nurc="http://www.nurc.nato.int" xmlns:sde="http://geoserver.sf.net" 
                xmlns:sf="http://www.openplans.org/spearfish" 
                xmlns:tiger="http://www.census.gov" 
                xmlns:topp="http://www.openplans.org/topp" 
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                elementFormDefault="qualified" targetNamespace="http://www.census.gov">
      <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
      <xsd:complexType name="poly_landmarksType">
        <xsd:complexContent>
          <xsd:extension base="gml:AbstractFeatureType">
            <xsd:sequence>
              <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="CFCC" nillable="true" type="xsd:string"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="LANAME" nillable="true" type="xsd:string"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
      <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>
    </xsd:schema>
    Re[2]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 11:57
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Аноним, Вы писали:


    А>>Поправьте меня, если я не совсем корректно поставил вопрос.

    МР>Я так понимаю, вы хотите найти все элементы (не важно на какой глубине вложенности в описании схемы они лежат), которые подпадают под некоторый критерий.

    МР>Но вот, какой это критерий, я не совсем понял.

    МР>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType, но вы хотите, чтобы в выборку попал и элемент the_geom, у которого тип gml:MultiSurfacePropertyType, а этот тип (если посмотреть в схему для пространства http://www.opengis.net/gml) является тоже ComplexType.

    МР>Поэтому, уточните, пожалуйста критерий отбора.


    Да, вы правы, я наврал с терминологией и the_geom тоже по сути комплексный элемент.
    Попробую объяснить еще раз, чего я хочу добиться:
    я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).
    т.е.

    1) <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>

    type="gml:MultiSurfacePropertyType", в данном xml нет описания типа (в явном виде) gml:MultiSurfacePropertyType(т.е. <xsd:complexType name="MultiSurfacePropertyType">), значит этот элемент нам подходит.

    2) <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>

    type="xsd:double", в данном xml нет описания типа (в явном виде) xsd:double(т.е. <xsd:complexType name="double">), значит этот элемент нам подходит.

    3) <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>

    type="tiger:poly_landmarksType", в данном xml есть описание типа tiger:poly_landmarksType (т.е. <xsd:complexType name="poly_landmarksType">), значит игнорируем этот элемент


    Здравствуйте, koodeer, Вы писали:

    K>Здравствуйте, Аноним, Вы писали:


    А>>В этом варианте 2 проблемы:

    А>>1) Вы получаете не только element, но и element, который является complexType.

    K>Я и написал: получаем все элементы и все атрибуты.

    K>Если нужен конкретный элемент и конкретный атрибут — используем второй пример.

    А>>2) Namespace неизвестен при разборе.


    K>Какой неймспейс? xmlns:xsd="http://www.w3.org/2001/XMLSchema" известен всегда, потому что это стандартный неймспейс xml-схемы. А другие не используются в моём примере.


    А>>При таком подходе мы пропускаем возможные element в корне (не относится к приведенному примеру, там в корне только complexType).


    K>Я не умею читать мысли. Нужно получить ещё какие-то элементы — добавляем код их получения.


    Про неймспейс я не прав, все остальное не по теме. Ваши примеры очевидны. Все равно спасибо за желание помочь.
    Re[3]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 12:05
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).

    А если описание типа в текущей XSD есть, но оно SimpleType?
    Re[4]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 12:07
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Михаил Романов, Вы писали:


    МР>>Здравствуйте, Михаил Романов, Вы писали:


    МР>>>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType,

    МР>>Ну и собственно вот мой вариант решения для этой задачи.
    МР>Да, совсем забыл — мне пришлось немного поменять исходную XSD, т.к. для компиляции схемы в XmlSchemaSet нужны все подключаемые схемы тоже, то я указал вместо локального сервера исходный (ну и если у вас будут использованы дополнительные схемы их нужно или явно добавить руками или указать импорт и откуда загружать):
    МР>
    МР><?xml version="1.0" encoding="UTF-8"?>
    МР><xsd:schema xmlns:cite="http://www.opengeospatial.net/cite" 
    МР>            xmlns:gml="http://www.opengis.net/gml" 
    МР>            xmlns:it.geosolutions="http://www.geo-solutions.it" 
    МР>            xmlns:nurc="http://www.nurc.nato.int" xmlns:sde="http://geoserver.sf.net" 
    МР>            xmlns:sf="http://www.openplans.org/spearfish" 
    МР>            xmlns:tiger="http://www.census.gov" 
    МР>            xmlns:topp="http://www.openplans.org/topp" 
    МР>            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    МР>            elementFormDefault="qualified" targetNamespace="http://www.census.gov">
    МР>  <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
    МР>  <xsd:complexType name="poly_landmarksType">
    МР>    <xsd:complexContent>
    МР>      <xsd:extension base="gml:AbstractFeatureType">
    МР>        <xsd:sequence>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="CFCC" nillable="true" type="xsd:string"/>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="LANAME" nillable="true" type="xsd:string"/>
    МР>        </xsd:sequence>
    МР>      </xsd:extension>
    МР>    </xsd:complexContent>
    МР>  </xsd:complexType>
    МР>  <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>
    МР></xsd:schema>
    МР>


    Спасибо, Михаил. Буду разбираться.
    Re[4]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 12:12
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Аноним, Вы писали:


    А>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).

    МР>А если описание типа в текущей XSD есть, но оно SimpleType?

    Я плохо разбираюсь в XSD, такое возможно?
    если да, то в таком случае желательно оставить этот элемент как есть.
    Re[5]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 12:21
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Здравствуйте, Михаил Романов, Вы писали:


    МР>>Здравствуйте, Аноним, Вы писали:


    А>>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).

    МР>>А если описание типа в текущей XSD есть, но оно SimpleType?

    А>Я плохо разбираюсь в XSD, такое возможно?

    Да, конечно возможно.
    Например вот так:
    <xsd:schema 
      ...
     elementFormDefault="qualified" targetNamespace="http://www.census.gov">
      <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
      <xsd:complexType name="poly_landmarksType">
        <xsd:complexContent>
          <xsd:extension base="gml:AbstractFeatureType">
            <xsd:sequence>
              <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="CFCC" nillable="true" type="xsd:string"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="LANAME" nillable="true" type="xsd:string"/>
              <xsd:element name="SS" type="tiger:MySimpeType" />
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
      <xsd:simpleType name="MySimpeType">
        <xsd:restriction base="xsd:integer">
          <xsd:maxExclusive value="4"/>
          <xsd:minInclusive value="-5"/>
        </xsd:restriction>
      </xsd:simpleType>
      <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>
    </xsd:schema>


    А>если да, то в таком случае желательно оставить этот элемент как есть.

    В смысле его не надо включать в конечную выборку или наоборот надо?
    Re[6]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 12:26
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Аноним, Вы писали:


    А>>Здравствуйте, Михаил Романов, Вы писали:


    МР>>>Здравствуйте, Аноним, Вы писали:


    А>>>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).

    МР>>>А если описание типа в текущей XSD есть, но оно SimpleType?

    А>>Я плохо разбираюсь в XSD, такое возможно?

    МР>Да, конечно возможно.
    МР>Например вот так:
    МР>
    МР><xsd:schema 
    МР>  ...
    МР> elementFormDefault="qualified" targetNamespace="http://www.census.gov">
    МР>  <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
    МР>  <xsd:complexType name="poly_landmarksType">
    МР>    <xsd:complexContent>
    МР>      <xsd:extension base="gml:AbstractFeatureType">
    МР>        <xsd:sequence>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="CFCC" nillable="true" type="xsd:string"/>
    МР>          <xsd:element maxOccurs="1" minOccurs="0" name="LANAME" nillable="true" type="xsd:string"/>
    МР>          <xsd:element name="SS" type="tiger:MySimpeType" />
    МР>        </xsd:sequence>
    МР>      </xsd:extension>
    МР>    </xsd:complexContent>
    МР>  </xsd:complexType>
    МР>  <xsd:simpleType name="MySimpeType">
    МР>    <xsd:restriction base="xsd:integer">
    МР>      <xsd:maxExclusive value="4"/>
    МР>      <xsd:minInclusive value="-5"/>
    МР>    </xsd:restriction>
    МР>  </xsd:simpleType>
    МР>  <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>
    МР></xsd:schema>
    МР>


    А>>если да, то в таком случае желательно оставить этот элемент как есть.

    МР>В смысле его не надо включать в конечную выборку или наоборот надо?

    в смысле в конечной выборке должен быть элемент с name="SS". спасибо за замечание
    Re[3]: Разбор XSD
    От: Mr.Delphist  
    Дата: 19.03.14 12:42
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).


    А если описание доступно через xsd:import или xsd:include, тогда как считаем? Вместе с включаемыми фрагментами (точнее, поддеревьями, т.к те xsd-фрагменты тоже могут использовать xsd:import и xsd:include, причём многоуровнево), или сугубо текущий xsd-файл и всё тут?
    Re[7]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 12:51
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>в смысле в конечной выборке должен быть элемент с name="SS". спасибо за замечание

    Хорошо, еще для полноты картины задам еще такой вопрос. А если у нас вот такая XML:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:cite="http://www.opengeospatial.net/cite" xmlns:gml="http://www.opengis.net/gml" xmlns:it.geosolutions="http://www.geo-solutions.it" xmlns:nurc="http://www.nurc.nato.int" xmlns:sde="http://geoserver.sf.net" xmlns:sf="http://www.openplans.org/spearfish" xmlns:tiger="http://www.census.gov" xmlns:topp="http://www.openplans.org/topp" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.census.gov">
      <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
      <xsd:complexType name="poly_landmarksType">
        <xsd:complexContent>
          <xsd:extension base="gml:AbstractFeatureType">
            <xsd:sequence>
              <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="LAND" nillable="true" type="xsd:double"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="CFCC" nillable="true" type="xsd:string"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="LANAME" nillable="true" type="xsd:string"/>
              <xsd:element name="SS" type="tiger:MySimpeType" />
              <xsd:element name="SS2">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="X1"/>
                    <xsd:element name="X2"/>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
      <xsd:simpleType name="MySimpeType">
        <xsd:restriction base="xsd:integer">
          <xsd:maxExclusive value="4"/>
          <xsd:minInclusive value="-5"/>
        </xsd:restriction>
      </xsd:simpleType>
      <xsd:element name="poly_landmarks" substitutionGroup="gml:_Feature" type="tiger:poly_landmarksType"/>
    </xsd:schema>


    Нужно ли включать в конечную выборку:

    P.S. Кстати, приведенный мною первый раз код не учитывает встроенное объявление типа. Чтобы это исправить нужно последний метод GetElements заменить на
    public List<XmlSchemaElement> GetElements(XmlSchemaParticle particle)
    {
        if (particle is XmlSchemaElement)
        {
            var element = particle as XmlSchemaElement;
            var result = new List<XmlSchemaElement> {element};
    
            var complexType = element.SchemaType as XmlSchemaComplexType;
            if (complexType != null)
            {
                if (complexType.ContentModel != null)
                    result.AddRange(GetElements(complexType.ContentModel.Content));
    
                if (complexType.Particle != null)
                    result.AddRange(GetElements(complexType.Particle));
            }
            return result;
        }
    
        if (particle is XmlSchemaGroupBase)
            return GetElements((particle as XmlSchemaGroupBase).Items);
    
        return new List<XmlSchemaElement>();
    }
    Re[4]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 12:55
    Оценка:
    Здравствуйте, Mr.Delphist, Вы писали:

    MD>или сугубо текущий xsd-файл и всё тут?

    Я понял именно так.
    Но, мне такой вариант кажется несколько сомнительным, поэтому я бы предположил, что устроит отбрасывание типов по Namespace.
    Т.е. если комплексный тип объявлен в нашем Namespace "http://www.census.gov" (не важно в каком файле), то отбрасываем его. Если же он объявлен в каком-то другом namespace — берем.

    Но тут нужно спрашивать автора — какой именно вариант ему подойдет.
    Re[4]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 13:12
    Оценка:
    Здравствуйте, Mr.Delphist, Вы писали:

    MD>Здравствуйте, Аноним, Вы писали:


    А>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).


    MD>А если описание доступно через xsd:import или xsd:include, тогда как считаем? Вместе с включаемыми фрагментами (точнее, поддеревьями, т.к те xsd-фрагменты тоже могут использовать xsd:import и xsd:include, причём многоуровнево), или сугубо текущий xsd-файл и всё тут?


    сугубо текущий xsd-файл и всё тут


    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Аноним, Вы писали:


    А>>в смысле в конечной выборке должен быть элемент с name="SS". спасибо за замечание

    МР>Хорошо, еще для полноты картины задам еще такой вопрос. А если у нас вот такая XML:


    МР>Нужно ли включать в конечную выборку:

    МР>
    в выборке должны быть X1 и X2

    PS Михаил, ваши вопросы заставили меня сомневаться, что я изначально правильно для себя определил задачу.
    PSS Михаил, есть ли где-нибудь хорошее (в идеале сокращенное) описание xsd?
    Re[5]: Разбор XSD
    От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
    Дата: 19.03.14 13:24
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>PS Михаил, ваши вопросы заставили меня сомневаться, что я изначально правильно для себя определил задачу.

    Ну, давайте попробуем разобраться совместно.
    Начните с исходной задачи.

    А>PSS Михаил, есть ли где-нибудь хорошее (в идеале сокращенное) описание xsd?

    Я сам разбирался по книге "Beginning XML, 2nd Edition — XML Schemas, SOAP, XSLT, DOM, and SAX 2.0" — с моей точки зрения, самая конкретная и "с минимум воды" книга по основам XML.
    Но нет гарантии, что там отражены все аспекты.
    Re[6]: Разбор XSD
    От: Аноним  
    Дата: 19.03.14 13:46
    Оценка:
    Здравствуйте, Михаил Романов, Вы писали:

    МР>Здравствуйте, Аноним, Вы писали:


    А>>PS Михаил, ваши вопросы заставили меня сомневаться, что я изначально правильно для себя определил задачу.

    МР>Ну, давайте попробуем разобраться совместно.
    МР>Начните с исходной задачи.

    А>>PSS Михаил, есть ли где-нибудь хорошее (в идеале сокращенное) описание xsd?

    МР>Я сам разбирался по книге "Beginning XML, 2nd Edition — XML Schemas, SOAP, XSLT, DOM, and SAX 2.0" — с моей точки зрения, самая конкретная и "с минимум воды" книга по основам XML.
    МР>Но нет гарантии, что там отражены все аспекты.

    Изначально я хотел дать пользователю выбор чтения значений для отдельных элементов, для моего примера это элементы
  • the_geom
  • LAND
  • CFCC
  • LANAME

    но сейчас уже сомневаюсь, что это правильно. надо еще раз пересмотреть подход.

    за книгу отдельное спасибо
  •  
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.