Jörgen Andersson Ответов: 2

Как создать XSD из XML


Итак, у меня есть XML-файл, который я хочу массово загрузить в базу данных.
Чтобы создать базу данных, было бы неплохо сначала извлечь из нее XSD.

Но размер файла составляет 80 ГБ, поэтому он не откроется в visual studio.
Это также довольно продвинутая структура, и мои примеры показывают, что может быть довольно легко пропустить некоторые причуды, если я не проверю весь файл.

Об использовании онлайн-конвертера не может быть и речи из-за размера файла. И я хотел бы избежать оплаты за инструмент, так как это, вероятно, одноразовый вариант.

Мне нужны кое-какие идеи, пожалуйста.

Что я уже пробовал:

Ну, я попробовал поискать идеи в google

F-ES Sitecore

Просто изучите xsd и сделайте это сами.

Jörgen Andersson

Это запасной план

Dave Kreskowiak

Вот что я в итоге сделал. Вы можете использовать инструмент XSD в качестве старта, если он работает для вас, но вам придется пройти через полученный XSD и исправить ошибки, которые он сделал, исходя из предположений, которые он сделал о вашем XML.

В моем случае мой XML был моим собственным творением и развивался, и я разрабатывал этот формат. Я просто отказался от инструмента, сгенерированного XSD, и начал его с нуля. Я закончил с дизайном модуля XSD, который я могу изменять по мере развития XML.

Jörgen Andersson

Проблема только в том, что я сам не создавал XML-файл.
Моя первая цель-найти все классы и поля.
Если я смогу использовать инструмент, я сэкономлю много времени.

Maciej Los

Йорген, ты пробовал использовать Инструмент определения XML-схемы (Xsd.exe) | Microsoft Docs[^]?

Кстати: есть ли какая-нибудь документация к этому XML?
В случае, если документация не существует, попробуйте использовать Класс XmlReader (System.Xml) | Microsoft Docs[^] в асинхронном режиме, чтобы прочитать содержимое xml-файла или попытаться загрузить этот xml-файл в набор данных.

phil.o

Я бы также предложил инструмент xsd. Может быть, вы могли бы сделать это решением?

Maciej Los

Спасибо! Сделано.

CHill60

Я тоже шел на это - я согласен с Филом.о - хорошее решение

Maciej Los

Спасибо! Сделано.

Jörgen Andersson

я попробую это сделать

Jörgen Andersson

Загрузка файла в набор данных также приводит к нехватке памяти.

2 Ответов

Рейтинг:
19

Maciej Los

Что ж...

Как было согласовано с @phil.o и @CHill60, лучший способ-использовать Инструмент определения XML-схемы (Xsd.exe) | Microsoft Docs[^]

Альтернативно, вы можете использовать Класс XmlReader (System.Xml) | Microsoft Docs[^] для чтения xml-данных в асинхронном режиме.

Удачи вам!


Jörgen Andersson

Получаю OutOfMemoryException.
Похоже, он пытается добавить весь файл в память.

Maciej Los

Итак, попробуйте использовать XmlReader и попытаться разделить этот большой xml на более мелкие части.

Jörgen Andersson

Я смотрю на это в данный момент, но это не готовое решение. Кажется, над этим нужно поработать.

Jörgen Andersson

Мой опыт:
При использовании XSD.exe важно проверить, используете ли вы 32-или 64-разрядную версию, 32-разрядная версия разбилась через пять секунд, в то время как 64-разрядная версия фактически работала почти четыре часа, прежде чем закончились ресурсы. Мой вывод заключается в том, что если файл помещается в память, то 64-битная версия XSD.exe я бы сделал эту работу.

Вместо этого я закончил тем что использовал XmlReader находя все имена элементов используя этот код который я нашел в сети:
Словарь<string, list<int="">> nodeTable = новый словарь<string, list<int="">>();
использование (XmlReader reader = XmlReader.Создать(documentPath))
{
в то время как (читатель.читать())
{
если (читатель.NodeType == XmlNodeType.Элемент)
{
если (!nodeTable.ContainsKey(читатель.параметр localName))
{
nodeTable.Добавить(читатель.LocalName, new List<int>(new int[] { reader.Глубина }));
}
еще если (!nodeTable[reader.параметр localName].Содержит(читатель.Глубина))
{
nodeTable[читатель.параметр localName].Добавить(читатель.Глубина);
}
}
}
}
Приставка.WriteLine("таблица узлов содержит элементы {0}.", nodeTable.Рассчитывать);
оператор foreach (KeyValuePair в<строка, список<инт=""&ГТ;&ГТ; кВ в nodeTable)
{
Приставка.Пиши("{0} [{1}]", кв.ключ, кв.значение.Рассчитывать);
for (int i = 0; i < kv.Value.Граф; i++)
{
если (я И Л; кв.Значение.Количество - 1)
{
Приставка.Напишите("{0}, ", kv.Value[i]);
}
еще
{
Приставка.WriteLine(kv.Value[i]);
}
}
}

Приставка.ReadKey();
А затем поиск в документе всех элементов, вырезание и вставка всех элементов в новый документ, содержащий все существующие элементы. А потом я побежал. Xsd.exe в этом файле.

Maciej Los

Звучит как ответ...

Рейтинг:
0

RickZeeland

Согласно этой статье CodeProject: Создание схемы XSD…... ни черта не зная о XSD.[^]

вы можете сгенерировать XSD из набора данных следующим образом:

MyDataSet.WriteXmlSchema(@"MySchema.xsd");


Jörgen Andersson

Да, но проблема в том, что у меня нет набора данных, у меня есть XML-файл размером 80 ГБ, поэтому я даже не могу создать набор данных, не исчерпав памяти.
По крайней мере, не без серьезного обновления оперативной памяти. :)

RickZeeland

Как предположил Мацей, лучше всего было бы извлечь значимые биты из XML-файла, поскольку в нем, вероятно, содержится много избыточных данных ... и в крайнем случае вы всегда можете выпить немного хорошего вина, чтобы взбодриться :)

Jörgen Andersson

В нем определенно много "избыточных" данных, каждая запись, по-видимому, составляет примерно от 10 до 20 кб
Проблема только в том, что в то время как некоторые части всегда есть, некоторые другие приходят и уходят. Или множество обнуляемых полей, если вы хотите так думать.