2015-02-10 5 views
1

Есть ли какой-либо API для создания XSD программно в java. Мне нужно сгенерировать XSD от Json-Schema, я буду читать Json Schema и на основе элементов, с которыми я сталкиваюсь во время разбора, необходимо создать соответствующие элементы XSD. Итак, если есть API, который может использовать элементы XSD, это поможет мне в процессе разработки.Генерировать XSD программно в java

+0

См. XSOM и Schemagen. – lexicore

+0

@ user2478236 Вы уже рассмотрели JAXB? См. Http://stackoverflow.com/a/7214065/4595816 и http://stackoverflow.com/a/11670962/4595816 – dbank

+0

@dbank да, я рассмотрел JAXB, но для его использования нам нужно создать jaxb аннотированные классы перед началом работы что невозможно, так как json является динамическим, с разными именами тегов – user2478236

ответ

4

Я использовал такие как XSOM и Xerces XML Schema к разобрана API, XSD, но их API, не предлагают методы программного генерировать XSD-х. (Я полагаю, вы могли бы попытаться получить доступ к их внутренним реализациям, чтобы каким-то образом генерировать XSD, но это было бы на свой страх и риск и, вероятно, не рекомендуется.)

Однако, поскольку XSD является самим документом XML, вы можете использовать что-то вроде DOM через 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, вы могли бы разобраться в логике, чтобы сделать что-то вроде приведенного выше примера.

+0

Спасибо, что я использовал ваш подход для генерации XSD из json Schema, и он работает хорошо. Спасибо за образец кода. – user2478236

Смежные вопросы