如何从DTD或XSD生成示例XML文档?

时间:2008-08-19 22:29:48

标签: xml xsd dtd test-data

我们正在开发一个涉及大量XML转换的应用程序。我们本身没有任何适当的输入测试数据,只有DTD或XSD文件。我们想从这些文件中自行生成测试数据。是否有一种简单/自由的方式来做到这一点?

修改

显然没有免费的工具,我同意OxygenXML是最好的工具之一。

19 个答案:

答案 0 :(得分:174)

在Visual Studio 2008 SP1及更高版本中,XML Schema Explorer可以创建包含一些基本样本数据的XML文档:

  1. 打开XSD文档
  2. 切换到XML Schema Explorer
  3. 右键单击根节点,然后选择“生成样本Xml”
  4. Screenshot of the XML Schema Explorer

答案 1 :(得分:123)

在免费和开源Eclipse IDE的最新版本中,您可以从DTD和XSD文件生成XML文档。右键单击给定的* .dtd或* .xsd文件,然后选择“生成 - > XML文件...”。您可以选择要生成的根元素以及是否应生成可选属性和元素。

当然,您也可以使用Eclipse来创建和编辑DTD和XSD架构文件。而且您不需要安装任何插件。它包含在标准发行版中。

答案 2 :(得分:29)

对于Intellij Idea用户:

查看工具 - > XML操作

enter image description here

似乎工作得非常好(据我测试过)。

编辑:

如@naXa所述,您现在也可以右键单击XSD文件并单击“从XSD架构生成XML文档...”

答案 3 :(得分:28)

我认为氧气(http://www.oxygenxml.com/)也是如此,但这是另一种商业产品。虽然这是一个很好的...我强烈建议任何人做很多XML工作。它也有一个很好的Eclipse插件。

我相信有一个免费的,功能齐全的30天试用版。

答案 4 :(得分:12)

Sourceforge.net上提供的camprocessor将为任何XSD执行xml测试用例生成。有一个教程可以向您展示如何生成自己的测试示例 - 包括使用内容提示来确保实际的示例,而不仅仅是随机的垃圾。

该教程可在此处获得: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

有关该工具的更多信息 - 使用OASIS内容组装机制(CAM)标准将您的XSD重构为更加符合XSLT的结构 - 可以从资源网站找到 - http://www.jcam.org.uk

享受,DW

答案 5 :(得分:10)

您可以使用属于Sun/Oracle Multi-Schema Validator

的XML实例生成器

这是README.txt声明:

  

Sun XML Generator是一个用于生成各种XML实例的Java工具   几种模式。它支持DTD,RELAX命名空间,RELAX Core,   TREX,以及W3C XML Schema Part 1的子集。[...]

     

这是一个可以生成有效和无效的命令行工具   来自模式的实例。它可用于生成XML的测试用例   需要符合特定模式的应用程序。

msv download page下载并解压xmlgen.zip并运行以下命令以获取详细的使用说明:

  

java -jar xmlgen.jar -help

该工具似乎是在BSD许可下发布的;源代码可从here

访问

答案 6 :(得分:9)

XMLSpy为你做到这一点,虽然这不是免费的......

我相信Liquid Xml Studio为你做了并且是免费的,但我没有亲自用它来创建测试数据。

答案 7 :(得分:7)

您还可以使用此处http://www.wmhelp.com中使用的XMLPad(免费使用) 生成您的xml示例。 从菜单:XSD - >生成示例XML文件。

答案 8 :(得分:7)

似乎到目前为止没有人能够回答这个问题:)

我使用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);

答案 9 :(得分:5)

Microsoft已发布“文档生成器”工具作为示例。 This is an article更详细地描述了示例应用程序的体系结构和操作。

如果您只想运行样本生成工具click here并安装MSI。

它是免费的。来源可用。需要.NET Framework才能运行。仅适用于XSD。 (不是放松NG或DTD)。

答案 10 :(得分:5)

XML-XIG:XML实例生成器

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

这个开源会有所帮助。

答案 11 :(得分:4)

Microsoft Office具有“InfoPath”,它将XSD作为导入,并允许您快速轻松地定义基于表单的编辑器以创建XML文件。它有两种模式 - 一种是您定义表单的模式,另一种是通过填写表单来创建XML文件的模式。我相信它首先出现在Office 2003中,大多数人从未安装过它。我对它的喜爱程度让我感到震惊。

答案 12 :(得分:1)

Liquid XML Studio有一个XML Sample Generator向导,它将从XML Schema构建示例XML文件。结果数据似乎符合模式(它不能生成正则表达式模式的数据)。

Generate an XML Sample from an XSD

答案 13 :(得分:1)

SoapUI的开源版本可以从WSDL(包含XSD类型定义)生成SOAP请求,因此看起来有一个这个功能的开源实现。不幸的是,我还没弄清楚使用哪个库。

答案 14 :(得分:1)

XMLBlueprint 7.5可以执行以下操作: - 从dtd生成样本xml - 从relax ng schema生成样本xml - 从xml架构生成样本xml

答案 15 :(得分:0)

OpenXSD库提到他们支持基于XSD生成XML实例。检查一下。

答案 16 :(得分:0)

为了完整性,我将添加http://code.google.com/p/jlibs/wiki/XSInstance,这是在类似(但特定于Java)的问题中提到的:Any Java "API" to generate Sample XML from XSD?

答案 17 :(得分:0)

XML蓝图也做到了;这里的说明

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

这不是免费的,但是有10天的免费试用期;它似乎快速有效;不幸的是它只是Windows。

答案 18 :(得分:0)

还有http://xsd2xml.com/,一个在线XSD到XML生成器