如何从其 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 文档?的主要内容,如果未能解决你的问题,请参考以下文章