При таком подходе мы пропускаем возможные element в корне (не относится к приведенному примеру, там в корне только complexType).
Ну и опять же мы не знаем Namespace.
Здравствуйте, Аноним, Вы писали:
А>В этом варианте 2 проблемы: А>1) Вы получаете не только element, но и element, который является complexType.
Я и написал: получаем все элементы и все атрибуты.
Если нужен конкретный элемент и конкретный атрибут — используем второй пример.
А>2) Namespace неизвестен при разборе.
Какой неймспейс? xmlns:xsd="http://www.w3.org/2001/XMLSchema" известен всегда, потому что это стандартный неймспейс xml-схемы. А другие не используются в моём примере.
А>При таком подходе мы пропускаем возможные element в корне (не относится к приведенному примеру, там в корне только complexType).
Я не умею читать мысли. Нужно получить ещё какие-то элементы — добавляем код их получения.
Здравствуйте, Аноним, Вы писали:
А>Поправьте меня, если я не совсем корректно поставил вопрос.
Я так понимаю, вы хотите найти все элементы (не важно на какой глубине вложенности в описании схемы они лежат), которые подпадают под некоторый критерий.
Но вот, какой это критерий, я не совсем понял.
Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType, но вы хотите, чтобы в выборку попал и элемент the_geom, у которого тип gml:MultiSurfacePropertyType, а этот тип (если посмотреть в схему для пространства http://www.opengis.net/gml) является тоже ComplexType.
Здравствуйте, Михаил Романов, Вы писали:
МР>Сначала, я подумал, что вы хотите все элементы, которые просто являются 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>();
}
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Михаил Романов, Вы писали:
МР>>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType, МР>Ну и собственно вот мой вариант решения для этой задачи.
Да, совсем забыл — мне пришлось немного поменять исходную XSD, т.к. для компиляции схемы в XmlSchemaSet нужны все подключаемые схемы тоже, то я указал вместо локального сервера исходный (ну и если у вас будут использованы дополнительные схемы их нужно или явно добавить руками или указать импорт и откуда загружать):
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Аноним, Вы писали:
А>>Поправьте меня, если я не совсем корректно поставил вопрос. МР>Я так понимаю, вы хотите найти все элементы (не важно на какой глубине вложенности в описании схемы они лежат), которые подпадают под некоторый критерий.
МР>Но вот, какой это критерий, я не совсем понял. МР>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType, но вы хотите, чтобы в выборку попал и элемент the_geom, у которого тип gml:MultiSurfacePropertyType, а этот тип (если посмотреть в схему для пространства http://www.opengis.net/gml) является тоже ComplexType.
МР>Поэтому, уточните, пожалуйста критерий отбора.
Да, вы правы, я наврал с терминологией и the_geom тоже по сути комплексный элемент.
Попробую объяснить еще раз, чего я хочу добиться:
я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).
т.е.
type="gml:MultiSurfacePropertyType", в данном xml нет описания типа (в явном виде) gml:MultiSurfacePropertyType(т.е. <xsd:complexType name="MultiSurfacePropertyType">), значит этот элемент нам подходит.
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>Я не умею читать мысли. Нужно получить ещё какие-то элементы — добавляем код их получения.
Про неймспейс я не прав, все остальное не по теме. Ваши примеры очевидны. Все равно спасибо за желание помочь.
Здравствуйте, Аноним, Вы писали:
А>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).
А если описание типа в текущей XSD есть, но оно SimpleType?
Re[4]: Разбор XSD
От:
Аноним
Дата:
19.03.14 12:07
Оценка:
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Михаил Романов, Вы писали:
МР>>Здравствуйте, Михаил Романов, Вы писали:
МР>>>Сначала, я подумал, что вы хотите все элементы, которые просто являются SimpleType, МР>>Ну и собственно вот мой вариант решения для этой задачи. МР>Да, совсем забыл — мне пришлось немного поменять исходную XSD, т.к. для компиляции схемы в XmlSchemaSet нужны все подключаемые схемы тоже, то я указал вместо локального сервера исходный (ну и если у вас будут использованы дополнительные схемы их нужно или явно добавить руками или указать импорт и откуда загружать): МР>
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Аноним, Вы писали:
А>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type). МР>А если описание типа в текущей XSD есть, но оно SimpleType?
Я плохо разбираюсь в XSD, такое возможно?
если да, то в таком случае желательно оставить этот элемент как есть.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Михаил Романов, Вы писали:
МР>>Здравствуйте, Аноним, Вы писали:
А>>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type). МР>>А если описание типа в текущей XSD есть, но оно SimpleType?
А>Я плохо разбираюсь в XSD, такое возможно?
Да, конечно возможно.
Например вот так:
А>если да, то в таком случае желательно оставить этот элемент как есть.
В смысле его не надо включать в конечную выборку или наоборот надо?
Re[6]: Разбор XSD
От:
Аноним
Дата:
19.03.14 12:26
Оценка:
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, Михаил Романов, Вы писали:
МР>>>Здравствуйте, Аноним, Вы писали:
А>>>>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type). МР>>>А если описание типа в текущей XSD есть, но оно SimpleType?
А>>Я плохо разбираюсь в XSD, такое возможно? МР>Да, конечно возможно. МР>Например вот так: МР>
Здравствуйте, Аноним, Вы писали:
А>я хочу получить в элементы (<xsd:element/>) при условии, что в данном xml нет их описания типа (type).
А если описание доступно через xsd:import или xsd:include, тогда как считаем? Вместе с включаемыми фрагментами (точнее, поддеревьями, т.к те xsd-фрагменты тоже могут использовать xsd:import и xsd:include, причём многоуровнево), или сугубо текущий xsd-файл и всё тут?
Здравствуйте, Аноним, Вы писали:
А>в смысле в конечной выборке должен быть элемент с name="SS". спасибо за замечание
Хорошо, еще для полноты картины задам еще такой вопрос. А если у нас вот такая XML:
элемент SS2. Он является ComplexType, но объявленным "на месте"
элементы X1 и X2, у них тип не обозначен, но с точки зрения XSD это "xsd:anyType", т.е. они могут иметь любое содержимое.
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>();
}
Здравствуйте, 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:
МР>Нужно ли включать в конечную выборку: МР>
МР>элемент SS2. Он является ComplexType, но объявленным "на месте" МР>элементы X1 и X2, у них тип не обозначен, но с точки зрения XSD это "xsd:anyType", т.е. они могут иметь любое содержимое. МР>
в выборке должны быть X1 и X2
PS Михаил, ваши вопросы заставили меня сомневаться, что я изначально правильно для себя определил задачу.
PSS Михаил, есть ли где-нибудь хорошее (в идеале сокращенное) описание xsd?
Здравствуйте, Аноним, Вы писали:
А>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
но сейчас уже сомневаюсь, что это правильно. надо еще раз пересмотреть подход.