Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как указать ссылку на схему в памяти (MS XML) / 8 сообщений из 8, страница 1 из 1
26.03.2009, 14:56
    #35893899
AlexeyStaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
Необходимо проверить файл XML по схеме с помощью MS XML 4. Файл и схема загружаются из памяти. Общие типы данных вынес в отдельную схему, которую необходимо подключать к каждой загружаемой схеме. Если бы схемы загружались с диска, то можно базовую схему подключить с помощью "<xs:include schemaLocation="mainXsd.xsd"/>". А если она уже прогружена в MSXML2::IXMLDOMDocumentPtr из памяти, то как быть? Сейчас приходит вариант самому склеивать две схемы в одну и ее прогружать, но как-то это некрасиво.
Базовая схема:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<xs:schema id="xsdMain" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="MyType">
	<xs:restriction base="xs:string">
		<xs:pattern value="[0-9]{6}"/>
	</xs:restriction>
</xs:simpleType>
</xs:schema>
Схема, которая использует базовую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<xs:schema id="mainNode" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="mainXsd.xsd"/> // Эта строчка не работает, если схема находится в памяти
<xs:element name="mainNode">
	<xs:complexType>
	<xs:sequence>
		<xs:element name="e1" type="MyType" />
		<xs:element name="e2" type="xs:string" />
	</xs:sequence>
	</xs:complexType>
</xs:element>
</xs:schema>
...
Рейтинг: 0 / 0
26.03.2009, 23:08
    #35895166
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
XMLSchemaCache

С уважением, Vasilisk
...
Рейтинг: 0 / 0
26.03.2009, 23:09
    #35895169
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
тынц

С уважением, Vasilisk
...
Рейтинг: 0 / 0
14.04.2009, 11:16
    #35929982
Minatavr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
А как сделать тоже самое, используя встроенный DOM?
...
Рейтинг: 0 / 0
14.04.2009, 11:19
    #35929997
Minatavr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
А еще, ни как не могу найти: как выцепить из XDocument все нэймспэйсы, которые ему нужны?
Пока, придумал тупо искать все атрибуты xmlns. Может быть, есть более цивилизованный способ?
...
Рейтинг: 0 / 0
14.04.2009, 22:48
    #35931883
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
MinatavrА как сделать тоже самое, используя встроенный DOM?
Что такое "встроенный" DOM?
...
Рейтинг: 0 / 0
15.04.2009, 09:31
    #35932183
Minatavr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
_Vasilisk_MinatavrА как сделать тоже самое, используя встроенный DOM?
Что такое "встроенный" DOM?

Вот, нашел цитату из книги "Как программировать на XML".
Рекомендация W3C, где рассмотрено построение дерева XML-документа называется объектной моделью документа (DOM) . Любой синтаксический анализатор, следующий этим рекомендациям, будем в дальнейшем называть анализатором DOM .
Класс XmlSerializer как раз следует этим рекомендациям. Значит его тоже можно отнести к DOM-анализаторам. А поскольку он входит в состав системных фрэймворковских библиотек (т.е. присутствует по умолчанию), то я и назвал его "встроенным".
Очень надеюсь, что эта неточность в терминологии не будет поводом для пустой полемики на тему "что же называть встроенным".

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

Создаю DataSet по некому XSD-шаблону.
В шаблоне присутствует такая строчка:
Код: plaintext
1.
  <xs:import namespace="urn:my-ns:common-types" schemaLocation="common-types.xsd" />

Но я не хочу, чтоб "common-types.xsd" лежал на диске. Хочу, чтоб он подтягивался из памяти. Для этого я делаю следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
     
            schemas.Add("urn:my-ns:common-types", xCommonTypes.CreateReader());

            settings.Schemas = schemas;

            settings.ValidationType = ValidationType.Schema;

            settings.ConformanceLevel = ConformanceLevel.Document;

            settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;

            settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

            settings.ValidationFlags |= XmlSchemaValidationFlags.AllowXmlAttributes;

            settings.ValidationEventHandler += ValidationCallBack;

            var reader = XmlReader.Create(xsd.CreateReader(), settings);

            var ds = (DataSet)serializer.Deserialize(reader);

Но на десериализации вываливается эксцепшн "Тип 'urn:my-ns:common-types:date' не объявлен". Т.е. мое пространство имен, где и описан тип "date" не подтянулось :(
...
Рейтинг: 0 / 0
15.04.2009, 17:27
    #35934203
Minatavr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как указать ссылку на схему в памяти (MS XML)
Вот, что удалось нарыть.

1.
Код: plaintext
var ds = (DataSet)serializer.Deserialize(reader);
Эта строка в конечном счете сводится к следующим строчкам в классе System.Data.DataSet:
Код: plaintext
1.
2.
3.
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchema schema = XmlSchema.Read(reader, null);
schemaSet.Add(schema);
schemaSet.Compile();

2. Формирование переменной reader описано в моем предыдущем посте. Т.е. в ее сеттингах присутствует мой common-types.xsd. Но в компиляции он не участвует.

А чтобы он участвовал, нужно либо добавить его в schemaSet , либо в schema.Includes .

Первое мне не доступно.

Второе можно сделать двумя способами:
1) методом schema.Includes.Add - опять же, не доступно
2) вернув в мой первоначальный XSD строку:
Код: plaintext
<xs:import namespace="urn:my-ns:common-types" schemaLocation="common-types.xsd" />
Но в этом случае, анализатор начинает искать "common-types.xsd" на диске.

Теперь вопрос: нельзя ли каким-нибудь образом перехватывать поиск XSD-шника?
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как указать ссылку на схему в памяти (MS XML) / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]