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

203

我们正在开发一个涉及大量XML转换的应用程序。我们没有任何适当的输入测试数据,只有DTD或XSD文件。我们希望从这些文件中自己生成测试数据。是否有一种简单/免费的方法可以做到这一点?

编辑

显然没有免费的工具可供使用,我同意OxygenXML是其中最好的工具之一。


8
我无法找到符合问答格式的回答,或者引发“争论、辩论、投票或延伸讨论”的解释。 - mjn
19个回答

185

在Visual Studio 2008 SP1及更高版本中,XML Schema Explorer可以创建一个带有基本示例数据的XML文档:

  1. 打开您的XSD文档
  2. 切换到XML Schema Explorer
  3. 右键单击根节点并选择“生成示例Xml”

XML Schema Explorer的截图


15
是的,这是最简单的方法。打开XSD文件,切换到XML Schema Explorer,选择根节点,右键点击并选择“生成示例Xml”。 - balint
3
我曾在 VS2008 中使用过这个,但是在 VS2010 中找不到了。有人能确认它是否仍然存在吗? - Simon
和Simon一样:我在VS2010中也找不到这个。根据MSDN的说法,它应该还在,但它就是不会出现在任何UI界面中... :-( - Martijn
6
当您在模式浏览器中右键单击元素时,才会出现“生成样本 XML”选项。 元素通过绿色的左/右尖括号"<>"以图形方式表示。 您可能正在右键单击类型,但是生成消息仅针对元素生成(这是有道理的)。请注意,不要修改原始意思。 - Miguel Sevilla
1
@TimAbell 如果是 xsd:choice,那么示例 XML 文件只能包含该选择中的一个。https://msdn.microsoft.com/zh-cn/library/ms256109(v=vs.110).aspx - Davos
显示剩余6条评论

131

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

当然,您也可以使用Eclipse创建和编辑您的DTD和XSD模式文件,无需安装任何插件。它已包含在标准发行版中。


你们知道 Eclipse 哪个功能提供了这个功能吗?我的“生成”子菜单只有“JAXB 类”这一项。 - otto.poellath
9
要获取这些选项,您需要安装Web Tools Project(在“帮助”->“安装新软件”下查找)。 - pwaring
3
Eclipse似乎是一个不错的选择,但我无法让生成器遵循导入的XSD。举个例子,如果我有一个描述3个元素的XSD,并且其中一个元素是在一个被引用/导入的XSD中定义的complexType,那么它将不会为该元素生成。有什么想法吗? - David Hergert
我更喜欢这种评分较低的 Visual Studio 方法,因为它有更多的选项。(Visual Studio 生成了一个非常简略的 XML 文件,其中任何可为空的元素都被设置为 nil,而 Eclipse 则给了我填充这些元素的选项。)还有一个小问题——XSD 文件必须放在工作区的某个地方吗?我希望能够通过“打开文件”来处理计算机或网络上的任何文件,而不是将其复制到工作区,但找不到方法。 - Steve Chambers
我认为Eclipse是最好的! - Christian Vielma
显示剩余3条评论

42

对于Intellij Idea用户:

点击"工具"-> "XML操作"

这里输入图片描述

据我所测试,它似乎运行的非常好。

编辑:

正如@naXa所提到的,您现在还可以右键单击XSD文件并单击“从XSD模式生成XML文档...”


有没有一种方法可以指定要生成的元素数量(用于序列)? - Nikita
1
在最新的基于Intellij Idea的RubyMine(v.7.0)中,对于具有许多导入的XSD文件,它对我不起作用。我只得到了错误消息。 - Envek
3
模式编译错误。 - Nate Anderson
1
在更新的版本中,右键单击 XSD 并选择“从 XSD 模式生成 XML 文档...” - naXa stands with Ukraine
不断提示“根元素名称无效”,并且什么也不做,“确定”按钮无法使用。 - Czar
显示剩余2条评论

31

我认为 Oxygen (http://www.oxygenxml.com/) 也可以实现这个功能,但那是另一个商业产品。不过它很不错... 我强烈建议所有从事大量XML工作的人使用该产品。它还有一个很好的Eclipse插件。

我相信有一个免费的、完整功能的30天试用期。


我有一堆XSD文件,这些文件从不同的XSD文件中继承模式,我需要从这些XSD文件生成一个XML文件用于测试目的。我正在使用oxygenXML来完成这个任务,但是当我尝试生成时,它却没有起作用,并显示“请定义根节点”,但它又不允许我这样做。所以,如果有人已经使用过oxygenXML,请建议我可以通过什么方法解决这个问题? - Rachel
谢谢leveland。这也回答了我的问题!如果您想回答我的问题:http://stackoverflow.com/questions/7041388/xmlvend-example-xml-request-and-response,我将非常乐意将您的回答标记为答案。 - Eric H
我尝试了许多选项,并发现Oxygen是最好的选择。它是商业软件,但提供免费试用版。我曾使用它从最臃肿的模式DDEX ERN中生成XML,并且表现良好。其他软件无法做到。 - sshaw

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

3
Sourceforge.net的直接下载链接为:http://sourceforge.net/projects/camprocessor。 - Jay Mooney
@Pyderman - 那是你的设置 - 查一下如何更改它们。 - Ghoti

10
你可以使用Sun/Oracle Multi-Schema Validator中的XML实例生成器。
它的README.txt文件如下:
Sun XML Generator是一个Java工具,用于从多种模式生成各种XML实例。它支持DTD、RELAX Namespace、RELAX Core、TREX和W3C XML Schema Part 1的子集。[...]
这是一个命令行工具,可以从模式生成有效和无效的实例。它可用于为需要符合特定模式的XML应用程序生成测试用例。
msv下载页面下载并解压缩xmlgen.zip,然后运行以下命令以获取详细的使用说明:

java -jar xmlgen.jar -help

该工具似乎是根据BSD许可证发布的;源代码可以从这里访问。

非常好!不过有一点限制。我尝试在导入其他XSD的XSD上使用它,但失败了。但在DTD上它运行得非常好。谢谢! - lindelof
1
当前链接:主页下载xmlgen.zip 仅在 nightly 目录中。我确认无法从我的 xsd 生成样例。 - Jarekczek
在我的案例中,我需要使用“--example”文件来包含可以用于生成新示例文件的令牌。制作一个样本需要用到另一个样本!这并不容易... - Nate Anderson
java.net链接基本上已经失效了。 - RedGrittyBrick

10

XMLSpy 可以为您完成这项工作,但需要付费...

我相信 Liquid Xml Studio 可以为您完成这项工作并且是免费的,但我个人没有使用它来创建测试数据。


它能够生成一些内容,但你无法对其进行太多控制:你只能选择顶级元素和一些通用选项,但无法使用XMLSpy生成包含许多变量的测试用例集等。 - Hans-Peter Störr
XMLSpy看起来不错,但生成的XML无法根据用于生成它的XSD进行验证。失败了。它还在“positiveinteger”字段上出现错误 - 放置了“ERROR”。 - Tim Abell

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);

7
您还可以使用免费的XMLPad(可在此处找到:http://www.wmhelp.com)生成您的XML样本。 从菜单中选择:XSD -> 生成样本XML文件。

当我选择“生成示例数据”时,我会遇到堆栈溢出或“WMHelp XmlPad已停止工作”的问题。 - Nate Anderson

5

1
不太用户友好。抛出了很多异常,得到了未经解释的“NullPointerException”后无法使其工作。 - Jarekczek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接