Есть ли какой-либо API для создания XSD программно в java. Мне нужно сгенерировать XSD от Json-Schema, я буду читать Json Schema и на основе элементов, с которыми я сталкиваюсь во время разбора, необходимо создать соответствующие элементы XSD. Итак, если есть API, который может использовать элементы XSD, это поможет мне в процессе разработки.Генерировать XSD программно в java
ответ
Я использовал такие как 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, вы могли бы разобраться в логике, чтобы сделать что-то вроде приведенного выше примера.
Спасибо, что я использовал ваш подход для генерации XSD из json Schema, и он работает хорошо. Спасибо за образец кода. – user2478236
- 1. Генерировать XSD из XML программно в Java
- 2. Как программно генерировать EMF-модель (.ecore, .genmodel) из схемы XSD?
- 3. Генерировать класс из XSD
- 4. JAXB генерировать Java-класс от XSD
- 5. Генерировать код Java из зависимых XSD
- 6. Java - генерировать XML из другого XML + XSD
- 7. генерировать Go структуры из XSD
- 8. проблема XSD - пытается генерировать XSD из XML
- 9. Есть ли способ генерировать значение xsd: ID в java?
- 10. Программный анализ XSD в Java
- 11. Генерировать xsd из необязательных элементов в XML
- 12. Почему весной неправильно генерировать Java классов из XSD
- 13. Программно генерировать диаграмму цвета?
- 14. Могу ли я генерировать xsd динамически с помощью Java?
- 15. SSRS: программно генерировать отчет
- 16. Программно генерировать файлы JavaDoc
- 17. программно генерировать ppt в iOS
- 18. Как генерировать RSS для новостных сайтов программно в java/j2ee?
- 19. Как генерировать документацию, ссылающуюся на существующий xsd
- 20. Кошмар пытается генерировать код из XSD
- 21. Генерировать XML из повторяющихся элементов XSD
- 22. Как я могу генерировать xsd динамически
- 23. Jackson: генерировать классы Джексона из XSD
- 24. clojure генерировать xml и xpaths из xsd
- 25. Генерировать XML из запроса с определением XSD?
- 26. Генерировать XSD от POJO (без JAXB)?
- 27. Как создать XSD-файл программно в C#?
- 28. Создать java-классы из xsd в myeclipse
- 29. Преобразование xml в xsd с помощью java
- 30. Генерировать голос программно - Обработка звука
См. XSOM и Schemagen. – lexicore
@ user2478236 Вы уже рассмотрели JAXB? См. Http://stackoverflow.com/a/7214065/4595816 и http://stackoverflow.com/a/11670962/4595816 – dbank
@dbank да, я рассмотрел JAXB, но для его использования нам нужно создать jaxb аннотированные классы перед началом работы что невозможно, так как json является динамическим, с разными именами тегов – user2478236