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

Posted

技术标签:

【中文标题】如何从其 DTD 或 XSD 生成示例 XML 文档?【英文标题】:How to generate sample XML documents from their DTD or XSD? 【发布时间】:2010-09-06 05:40:48 【问题描述】:

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

编辑

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

【问题讨论】:

我没有看到这个不符合问答格式的问题的答案,或者请求debate, arguments, polling, or extended discussion 【参考方案1】:

XMLSpy 会为你做这件事,虽然这不是免费的......

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

【讨论】:

它会生成一些东西,但你对它没有太多控制权:你可以选择***元素和一些通用选项,但你不能使用 XMLSpy 生成具有许多变体的测试用例集等。 XMLSpy 看起来不错,但生成的 xml 然后无法针对用于生成它的 xsd 进行验证。失败。它还在 postiveinteger 字段上吐槽 - 而是将 *ERROR* 放入【参考方案2】:

我认为 Oxygen (http://www.oxygenxml.com/) 也可以,但那是另一种商业产品。不过,这是一个不错的选择……我强烈建议任何从事大量 XML 工作的人使用它。它也带有一个不错的 Eclipse 插件。

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

【讨论】:

我有一堆 XSD,它们又从不同的 XSD 继承模式,我需要从这个 XSD 生成一个用于测试目的的 XML 文件,我正在使用oxyXML 来执行此操作,但是当我尝试这样做时,它对我不起作用,它说请定义根节点,但它不允许我这样做。因此,如果有人曾使用过oxyxXML,那么是否可以提出解决办法? 谢谢水平。这也回答了我的问题!如果您想来回答我的问题:***.com/questions/7041388/…,我很乐意将您的问题标记为答案。【参考方案3】:

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

    打开您的 XSD 文档 切换到 XML 模式资源管理器 右键单击根节点并选择“生成示例 Xml”

【讨论】:

是的,这是最简单的方法。打开XSD,切换到XML Schema Explorer,选择根节点,右键选择“Generate Sample Xml”。 我在 VS2008 中使用过这个,但在 VS2010 中找不到这个。任何人都可以确认这仍然存在吗? 和 Simon 一样:我在 VS2010 中也找不到这个。根据 MSDN,它应该仍然存在,但它不会出现在 UI 中的任何地方...... :-( @Simon:当您右键单击模式资源管理器中的元素之一时,您只会获得“生成示例 XML”。元素通过绿色的左/右尖括号以图形方式描述:“”。您可能正在右键单击一个类型,生成消息只会为元素生成它(这是有道理的)。 @TimAbell ,如果是 xsd:choice,那么示例 xml 文件只能包含该选项之一。 msdn.microsoft.com/en-us/library/ms256109(v=vs.110).aspx【参考方案4】:

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

【讨论】:

Sourceforge.net 下载的直接链接是:sourceforge.net/projects/camprocessor @Pyderman - 这是你的设置 - 查看如何更改它们。【参考方案5】:

您可以使用Sun/Oracle Multi-Schema Validator 中的 XML 实例生成器。

这是 README.txt 状态:

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

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

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

java -jar xmlgen.jar -help

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

【讨论】:

非常好!不过有点局限。我在导入其他 XSD 的 XSD 上进行了尝试,但失败了。但是在 DTD 上它工作得很好。谢谢! 当前链接:homepage、downloads。 xmlgen.zip 仅在 nigthly 目录中。我确认无法从我的 xsd 生成样本。 就我而言,需要使用--example 文件来包含可用于生成新示例文件的令牌。制作样品需要样品!不容易…… java.net 链接基本死了。【参考方案6】:

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

如果您只想运行示例生成工具,click here 并安装 MSI。

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

【讨论】:

以上链接指向 MSDN 上名为“从 XML 模式生成 XML 文档”的文章 安装程序将一堆 C# 代码放到你的机器上。只需将它们转储到 LinqPad 中,您就拥有了免费的 XML 实例生成器。哒哒! 9 年后,这仍然适用于 XSD。【参考方案7】:

Microsoft Office 具有“InfoPath”,它将 XSD 作为导入,让您可以快速轻松地定义基于表单的编辑器来创建 XML 文件。它有两种模式——一种是定义表单,另一种是通过填写表单来创建 XML 文件。我相信它首先是随 Office 2003 一起提供的,而且大多数人从不安装它。我对它的喜爱程度让我震惊。

【讨论】:

【参考方案8】:

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

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

【讨论】:

谢谢! Eclipse 是免费的,这是完美的解决方案。 你们是否知道 Eclipse 特性提供了这个功能?我的“生成”子菜单只有“JAXB 类”。 您需要安装 Web 工具项目(在帮助->安装新软件下查看)才能获得这些选项。 Eclipse 似乎是一个不错的选择,但我无法让这一代人遵循导入的 XSD。例如,如果我有一个描述 3 个元素的 XSD,其中一个是在引用/导入的 XSD 中定义的 complexType,它不会为该元素生成。有什么想法吗? @DavidHergert 一个简单的解决方法是生成存根类型。【参考方案9】:

XMLBlueprint 7.5 可以执行以下操作: - 从 dtd 生成示例 xml - 从松弛 ng 模式生成示例 xml - 从 xml 架构生成示例 xml

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

XML-XIG:XML 实例生成器

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

这个开源会很有帮助。

【讨论】:

对用户不太友好。抛出很多异常,无法解释后无法使其工作NullPointerException【参考方案13】:

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

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

【讨论】:

【参考方案14】:

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

【讨论】:

你能发一个使用例子吗?【参考方案15】:

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

【讨论】:

我试过这个并按照建议运行它:xsd-instance.sh purchase-order.xsd http://jlibs.orgPurchaseOrder 出错:Error: Unable to initialize main class jlibs.xml.xsd.XSInstance Caused by: java.lang.NoClassDefFoundError: org/apache/xerces/xs/XSObject【参考方案16】:

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

【讨论】:

当我选择“生成样本数据”时出现堆栈溢出或“WMHelp XmlPad 已停止工作”【参考方案17】:

对于 Intellij Idea 用户:

查看工具 -> XML 操作

似乎工作得很好(据我测试)。

编辑:

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

【讨论】:

有没有办法指定要生成的元素数(对于序列)? 我测试了这个线程的每个解决方案,效果最好 在带有许多导入的 XSD 的最新 RubyMine(v. 7.0,基于 Intellij Idea)中不适用于我。除了错误消息,我什么都没有。 “架构编译错误”? 在较新的版本中,右键单击 XSD 并选择“从 XSD 架构生成 XML 文档...”【参考方案18】:

XML 蓝图也可以做到这一点;这里有说明

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

它不是免费的,但有 10 天的免费试用期;看起来又快又高效;不幸的是,它只是 Windows。

【讨论】:

【参考方案19】:

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

【讨论】:

不幸的是,它没有从 XSD 生成有效的 XML。然而,其他工具在这个任务中失败了——Eclipse、Intellij IDEA 甚至 XMLSpy。到目前为止我发现的最好的是 liquid-technologies.com/online-xsd-to-xml-converter 但是如果 XSD 中有模式,即使这个也无法生成有效的 XML。

以上是关于如何从其 DTD 或 XSD 生成示例 XML 文档?的主要内容,如果未能解决你的问题,请参考以下文章

XML的验证模式DTD与XSD的区别

如何将XML链接到XSD?

XML, DTD, XSD, SGML

VB中使用XSD生成的类读取XML示例

Maven 中的 XML DTD/Schema 验证

Maven 中的 XML DTD/Schema 验证