代码之家  ›  专栏  ›  技术社区  ›  lindelof

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

  •  175
  • lindelof  · 技术社区  · 16 年前

    我们正在开发一个涉及大量XML转换的应用程序。我们本身没有任何适当的输入测试数据,只有DTD或XSD文件。我们希望自己从这些文件生成测试数据。有简单/自由的方法吗?

    编辑

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

    19 回复  |  直到 6 年前
        1
  •  27
  •   levand    16 年前

    我想是氧气( http://www.oxygenxml.com/ )也可以,但那是另一种商业产品。不过,这是个不错的主意…我强烈建议任何做大量XML工作的人使用它。它也有一个不错的Eclipse插件。

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

        2
  •  172
  •   Justin    13 年前

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

    1. 打开XSD文档
    2. 切换到XML架构资源管理器
    3. 右键单击根节点并选择“生成示例XML”

    Screenshot of the XML Schema Explorer

        3
  •  121
  •   Florian Fankhauser    15 年前

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

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

        4
  •  29
  •   yamass    7 年前

    对于Intellij IDEA用户:

    查看工具->XML操作

    enter image description here

    似乎工作得很好(就我所测试的而言)。

    编辑:

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

        5
  •  12
  •   David Webber    16 年前

    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

        6
  •  9
  •   m01    12 年前

    您可以使用XML实例生成器,它是 Sun/Oracle Multi-Schema Validator .

    它的readme.txt状态:

    Sun XML生成器是一种Java工具,用于生成各种XML实例。 几种模式。它支持DTD、RELAX名称空间、RELAX核心、 以及W3CXML模式第1部分的一个子集。[…]

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

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

    java -jar xmlgen.jar -help

    该工具似乎是根据BSD许可证发布的;源代码可从 here

        7
  •  9
  •   karlingen    8 年前

    XMLSpy 是为你做的,尽管那不是免费的…

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

        8
  •  7
  •   Michal Rames    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);
    
        9
  •  6
  •   Pat B    9 年前

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

        10
  •  5
  •   Cheeso    15 年前

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

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

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

        11
  •  5
  •   rolandpeng    14 年前

    xml-xig:xml实例生成器

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

    这个开源软件会很有帮助。

        12
  •  4
  •   Kieveli    15 年前

    Microsoft Office已经 InfoPath ,它将XSD作为导入,并允许您快速轻松地定义用于创建XML文件的基于表单的编辑器。它有两种模式——一种是定义表单,另一种是通过填写表单来创建XML文件。我相信它最初是与Office2003一起提供的,而且大多数人从未安装过它。我很喜欢它,这让我震惊。

        13
  •  1
  •   Peter    15 年前

    XMLBlueprint 7.5可以执行以下操作: -从DTD生成示例XML -从RELAXNG模式生成示例XML -从XML架构生成示例XML

        14
  •  1
  •   otto.poellath    14 年前

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

        15
  •  1
  •   Sprotty    8 年前

    Liquid XML Studio具有 XML Sample Generator 将从XML架构生成示例XML文件的向导。结果数据似乎符合模式(它只是不能为regex模式生成数据)。

    Generate an XML Sample from an XSD

        16
  •  0
  •   Aravind Yarram    13 年前

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

        17
  •  0
  •   Community CDub    7 年前

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

        18
  •  0
  •   Bambax    12 年前

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

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

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

        19
  •  0
  •   Sphinxxx    6 年前

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