Как сгенерировать образцы XML-документов из их DTD или XSD?

Мы разрабатываем приложение, которое включает в себя значительное количество преобразований XML. Как таковых, у нас нет никаких надлежащих входных тестовых данных, только файлы DTD или XSD. Мы хотели бы сами сгенерировать наши тестовые данные из этих файлов. Есть ли простой / бесплатный способ сделать это?

Редактировать

По-видимому, для этого нет бесплатных инструментов, и я согласен с тем, что OxygenXML - один из лучших инструментов для этого.

Ответов (19)

Решение

Я думаю, что Oxygen ( http://www.oxygenxml.com/ ) тоже делает это, но это еще один коммерческий продукт. Тем не менее, он хороший ... Я настоятельно рекомендую его всем, кто много работает с XML. Он также входит в хороший плагин Eclipse.

Я верю, что есть бесплатная полнофункциональная 30-дневная пробная версия.

В библиотеке OpenXSD упоминается, что они поддерживают создание экземпляров XML на основе XSD. Проверь это.

Вы также можете использовать XMLPad (бесплатный), который можно найти здесь http://www.wmhelp.com, для создания ваших xml-образцов. Из меню: XSD -> создать образец XML-файла.

XML Blueprint также делает то же самое; инструкции здесь

http://www.xmlblueprint.com/help/html/topic_170.htm

Это не бесплатно, но есть 10-дневная бесплатная пробная версия; кажется быстрым и эффективным; к сожалению, это только Windows.

Также существует http://xsd2xml.com/ , онлайн-генератор XSD в XML.

В Visual Studio 2008 SP1 и более поздних версиях проводник XML-схемы может создавать XML-документ с некоторыми базовыми образцами данных:

  1. Откройте ваш XSD-документ
  2. Перейти в обозреватель XML-схем
  3. Щелкните правой кнопкой мыши корневой узел и выберите «Создать образец XML».

Снимок экрана проводника XML-схемы

В Liquid XML Studio есть мастер генератора образцов XML, который будет создавать образцы файлов XML из схемы XML. Полученные данные, похоже, соответствуют схеме (они просто не могут генерировать данные для шаблонов регулярных выражений).

Создать образец XML из XSD

Для пользователей Intellij Idea:

Взгляните на Инструменты -> Действия XML.

введите описание изображения здесь

Кажется, работает очень хорошо (насколько я тестировал).

Редактировать:

Как упомянул @naXa, теперь вы также можете щелкнуть правой кнопкой мыши файл XSD и выбрать «Создать XML-документ из схемы XSD ...»

Для полноты я добавлю http://code.google.com/p/jlibs/wiki/XSInstance , который упоминался в аналогичном (но специфичном для Java) вопросе: какой-либо «API» Java для генерации образца XML из XSD?

XMLSpy сделает это за вас, хотя это не бесплатно ...

Я считаю, что Liquid Xml Studio делает это за вас и является бесплатным, но я лично не использовал его для создания тестовых данных.

Camprocessor, доступный на Sourceforge.net, будет генерировать тестовые примеры xml для любого XSD. Доступно учебное пособие, которое покажет вам, как создавать собственные тестовые примеры, включая использование подсказок по содержанию для обеспечения реалистичных примеров, а не только случайных ненужных.

Учебник доступен здесь: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

И дополнительную информацию об этом инструменте, который использует стандарт OASIS Content Assembly Mechanism (CAM) для преобразования вашего XSD в более дружественную XSLT структуру, можно найти на веб-сайте ресурсов - http://www.jcam.org.uk

Наслаждайтесь, DW

Вы можете использовать генератор экземпляров XML, который является частью Sun / Oracle Multi-Schema Validator .

В README.txt говорится:

Sun XML Generator - это инструмент Java для создания различных экземпляров XML из нескольких типов схем. Он поддерживает DTD, пространство имен RELAX, RELAX Core, TREX и подмножество W3C XML Schema Part 1. [...]

Это инструмент командной строки, который может создавать как действительные, так и недопустимые экземпляры из схем. Его можно использовать для создания тестовых примеров для приложений XML, которые должны соответствовать определенной схеме.

Загрузите и распакуйте xmlgen.zip со страницы загрузки msv и выполните следующую команду, чтобы получить подробные инструкции по использованию:

java -jar xmlgen.jar -help

Похоже, что инструмент выпущен под лицензией BSD; исходный код доступен отсюда

Microsoft опубликовала инструмент «генератор документов» в качестве образца. В этой статье подробно описывается архитектура и работа примера приложения.

Если вы просто хотите запустить инструмент создания образцов, щелкните здесь и установите MSI.

Это бесплатно. Источник доступен. Для работы требуется .NET Framework. Работает только с XSD. (не Relax NG или DTD).

В Microsoft Office есть « InfoPath », который принимает XSD в качестве импорта и позволяет быстро и легко определить редактор на основе форм для создания файлов XML. Он имеет два режима: в одном вы определяете форму, а в другом вы создаете XML-файл, заполнив форму. Я считаю, что он впервые появился в Office 2003, и большинство людей никогда его не устанавливают. Меня шокирует, насколько мне это нравится.

В последних версиях бесплатной Eclipse IDE с открытым исходным кодом вы можете создавать XML-документы из файлов DTD и XSD. Щелкните правой кнопкой мыши заданный файл * .dtd или * .xsd и выберите «Создать -> XML-файл ...». Вы можете выбрать, какой корневой элемент генерировать, и должны ли создаваться дополнительные атрибуты и элементы.

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

XMLBlueprint 7.5 может делать следующее: - генерировать образец xml из dtd - генерировать образец xml из схемы Relax ng - генерировать образец xml из схемы xml

Версия SoapUI с открытым исходным кодом может генерировать запросы SOAP из WSDL (который содержит определения типов XSD), поэтому похоже, что существует реализация этой функции с открытым исходным кодом. К сожалению, я не понял, какая библиотека для этого используется.

XML-XIG: генератор экземпляров XML

http://xml-xig.sourceforge.net/

Этот открытый исходный код был бы полезен.

Похоже, что пока никто не смог ответить на вопрос :)

Я использую EclipseLink MOXy для динамического создания классов привязки, а затем рекурсивно просматриваю связанные типы. Это несколько тяжеловато, но позволяет вводить значения XPath после создания экземпляра дерева объектов:

InputStream in = new FileInputStream(PATH_TO_XSD);
DynamicJAXBContext jaxbContext = 
            DynamicJAXBContextFactory.createContextFromXSD(in, null, Thread.currentThread().getContextClassLoader(), null);
DynamicType rootType = jaxbContext.getDynamicType(YOUR_ROOT_TYPE);
DynamicEntity root = rootType.newDynamicEntity();
traverseProps(jaxbContext, root, rootType, 0);

TraverseProps - довольно простой рекурсивный метод:

private void traverseProps(DynamicJAXBContext c, DynamicEntity e, DynamicType t, int level) throws DynamicException, InstantiationException, IllegalAccessException{
        if (t!=null) {
            logger.info(indent(level) + "type [" + t.getName() + "] of class [" + t.getClassName() + "] has " + t.getNumberOfProperties() + " props");
            for (String pName:t.getPropertiesNames()){
                Class<?> clazz = t.getPropertyType(pName);
                logger.info(indent(level) + "prop [" + pName + "] in type: " + clazz);
                //logger.info("prop [" + pName + "] in entity: " + e.get(pName));

                if (clazz==null){
                    // need to create an instance of object
                    String updatedClassName = pName.substring(0, 1).toUpperCase() + pName.substring(1);
                    logger.info(indent(level) + "Creating new type instance for " + pName + " using following class name: " + updatedClassName );
                    DynamicType child = c.getDynamicType("generated." + updatedClassName);
                    DynamicEntity childEntity = child.newDynamicEntity();
                    e.set(pName, childEntity);
                    traverseProps(c, childEntity, child, level+1);
                } else {
                    // just set empty value
                    e.set(pName, clazz.newInstance());
                }
            }
        } else {
            logger.warn("type is null");
        }
    }

Преобразовать все в XML довольно просто:

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);