在java中以编程方式生成XSD

2024-04-19

是否有任何API可以在java中以编程方式生成XSD? 我需要从 Json-Schema 生成 XSD,我将阅读 Json Schema 并根据我在解析过程中遇到的元素需要创建适当的 XSD 元素。 因此,如果有任何可以支持 XSD 元素的 API,它将对我的开发过程有所帮助。


我使用过 API,例如XSOM https://xsom.java.net/ and Xerces XML 模式 http://xerces.apache.org/xerces2-j/faq-xs.html#faq-11 to parseXSD,但他们的 API 不提供以编程方式进行的方法generateXSD 的。 (我想您可以尝试访问他们的内部实现以某种方式生成 XSD,但这将由您自己承担风险,并且可能是不明智的。)

但是,由于 XSD 本身就是 XML 文档,因此您可以使用类似的内容DOM http://www.w3.org/DOM/通过JAXP http://docs.oracle.com/javase/tutorial/jaxp/以编程方式创建 XSD:

package dbank.so;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.XMLConstants;


import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class SchemaGenExample {

    private final static String NS_PREFIX = "xs:";

    public static void main(String[] args) {
        try {
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

            Document doc = docBuilder.newDocument();

            Element schemaRoot = doc.createElementNS(XMLConstants.W3C_XML_SCHEMA_NS_URI, NS_PREFIX+"schema");
            doc.appendChild(schemaRoot);

            NameTypeElementMaker elMaker = new NameTypeElementMaker(NS_PREFIX, doc);

            Element idType = elMaker.createElement("simpleType", "idType");
            schemaRoot.appendChild(idType);
            Element idTypeRestr = elMaker.createElement("restriction");
            idTypeRestr.setAttribute("base", NS_PREFIX+"string");
            idType.appendChild(idTypeRestr);
            Element idTypeRestrPattern = elMaker.createElement("pattern");
            idTypeRestrPattern.setAttribute("value", "[0-9]{6}");
            idTypeRestr.appendChild(idTypeRestrPattern);

            Element itemType = elMaker.createElement("complexType", "itemType");
            schemaRoot.appendChild(itemType);
            Element sequence = elMaker.createElement("sequence");
            itemType.appendChild(sequence);
            Element itemIdElement = elMaker.createElement("element", "ItemId", "idType");
            sequence.appendChild(itemIdElement);
            Element itemNameElement = elMaker.createElement("element", "ItemName", NS_PREFIX+"string");
            sequence.appendChild(itemNameElement);         

            Element itemElement = elMaker.createElement("element", "Item", "itemType");
            schemaRoot.appendChild(itemElement);


            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource domSource = new DOMSource(doc);
            //to create a file use something like this:
            transformer.transform(domSource, new StreamResult(new File("mySchema.xsd")));
            //to print to console use this:
            transformer.transform(domSource, new StreamResult(System.out));
        }
        catch (FactoryConfigurationError | ParserConfigurationException | TransformerException e) {
            //handle exception
            e.printStackTrace();
        }
    }

    /*
     * Class with methods to make it more convenient to create Element nodes with
     * namespace prefixed tagnames and with "name" and "type" attributes. 
     */
    private static class NameTypeElementMaker {
        private String nsPrefix;
        private Document doc;

        public NameTypeElementMaker(String nsPrefix, Document doc) {
            this.nsPrefix = nsPrefix;
            this.doc = doc;
        }

        public Element createElement(String elementName, String nameAttrVal, String typeAttrVal) {
            Element element = doc.createElementNS(XMLConstants.W3C_XML_SCHEMA_NS_URI, nsPrefix+elementName);
            if(nameAttrVal != null)
                element.setAttribute("name", nameAttrVal);
            if(typeAttrVal != null)
                element.setAttribute("type", typeAttrVal);
            return element;
        }

        public Element createElement(String elementName, String nameAttrVal) {
            return createElement(elementName, nameAttrVal, null);
        }

        public Element createElement(String elementName) {
            return createElement(elementName, null, null);
        }
    }
}

这将创建一个如下所示的 mySchema.xsd:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="idType">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{6}"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="itemType">
        <xs:sequence>
            <xs:element name="ItemId" type="idType"/>
            <xs:element name="ItemName" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Item" type="itemType"/>
</xs:schema>

它可用于 XML 文件,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="mySchema.xsd">
    <ItemId>123456</ItemId>
    <ItemName>Foo Bar</ItemName>
</Item>

我从未使用过 JSON Schema,但我想当您解析 JSON 或迭代 JSON 数据结构时,您可以理清逻辑以执行与上面示例类似的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java中以编程方式生成XSD 的相关文章

  • 设置 jdialog 框中文本的格式

    我有一个 JOptionPane JOptionPane showMessageDialog null text 文字是一个刺 String text Hello world 我想做的是改变文本的颜色 特别是一个单词 让我们说 你好 所以我
  • Java Selenium + 2Captcha + 提交表单

    你好 我正在尝试自动化一些流程 我正在使用 2captch 来解决验证码问题 请查看图像 https i stack imgur com HiRAU jpg 我有 site key 和 api key 现在我正在发送 api key sit
  • Java 方法重写和变量遮蔽

    public class Circle public float r 100 public float getR return r public class GraphicCircle extends Circle public float
  • Elasticsearch:将新元素附加到对象的嵌套数组

    我正在尝试将新项目添加到特定文档中的嵌套对象数组中 我已经搜索过 似乎部分文档的更新不支持我需要的内容 它用新元素替换了整个数组 所以我进行了脚本化更新 它通过 REST API 按预期工作 PUT transactions mapping
  • Java 加载类时如何管理内存?

    想象一下 我有一个包含 10 个方法的类 我需要从该类中实例化 10 个对象 问题是 JVM 会在对象创建时为 10 个实例分配 10 个不同的内存空间 我的意思是在我调用构造函数时 即 new MyClass 吗 或者它会在内存中加载一次
  • 当我通过反射创建对象时,如何重写 Java 中的方法?

    In Java 是否可以覆盖您使用创建的类中的方法reflection 例如 假设我有以下课程 public class MyObject public String foo bar public MyObject String foo t
  • 来自给定 wsdl 文件的“java 表单生成器”

    我正在尝试用 java 开发一个表单生成器 用户可以在其中编写 wsdl url 并获取 ComboBox 中 Web 服务支持的操作列表 当用户选择 ComboBox 中的一项时 他将看到使用 wsdl url 生成的表单字段 我是 We
  • 将JSON数据解析到Android ListView中

    我已经潜伏这个网站很长一段时间了 幸运的是 到目前为止我所有的问题都得到了解答 我希望你们中的一些人能够阐明我的问题 我可以成功地让 ListView 来显示字符串数组 但是当我尝试将 JSON 数据解析为数组时 我的程序只是强制关闭 而
  • Facebook4j API:搜索

    我正在使用 Facebook4j 通过关键字获取状态 facebook4j conf ConfigurationBuilder fac new facebook4j conf ConfigurationBuilder fac setDebu
  • Spring、JPA 和 Hibernate - 如何在没有并发问题的情况下增加计数器

    我正在使用 Spring 和 JPA Hibernate 但我对增加表中计数器的正确方法有点困惑 我的 REST API 需要根据用户操作增加和减少数据库中的某些值 在下面的示例中 喜欢或不喜欢标签将使标签表中的计数器增加或减少 1 tag
  • 当你的方法签名不允许抛出异常时如何抛出异常?

    我有一个这样的方法 public void getSomething 我想扔一个Exception inside getSomething 编译器不允许我这样做 因为我的方法不允许Exception被扔在那里 但我需要抛出一个子类Excep
  • 给定一个零索引数组 & 该数组的平衡索引[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给出一个由 N 个整数组成的零索引数组 A 该数组的平衡索引是任何整数 P 满足 0 P 例如 考虑以下由 N 8 个元素组成的数组
  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • 如果列名不同,则一对多休眠连接

    我有三个具有以下结构的表 合同 gt Contract id 主要 customer company id Vendor company id 公司 gt Company id 主要 创建日期 创建者 Company Timeline gt
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • JavaFX 2.0 FXML 子窗口

    经过多次搜索我发现了这个问题如何创建 javafx 2 0 应用程序 MDI https stackoverflow com questions 10915388 how to create a javafx 2 0 application
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 无法使用 NSDateFormatter 解析日期

    我正在获取 RSS 其中我收到以下日期戳 2010 05 10T06 11 14 000Z 现在我正在使用 NSDateFormatter 来解析这个日期时间戳 parseFormatter setDateFormat yyyy MM dT
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac

随机推荐