Генерировать классы Java из.XSD файлов …?

Вот код, который должен это сделать:

import boto3
client = boto3.client('ec2', region_name='ap-southeast-2')

def handler(event, context):

    # Get a list of instances
    response = client.describe_instances()

    # For each instance
    for reservation in response['Reservations']:
        for instance in reservation['Instances']:

            # Extract existing tags
            tags = [tag['Key'] for tag in instance['Tags']]

            if 'MyID' not in tags:
                # Add a tag
                tag_response = client.create_tags(
                    Resources=[instance['InstanceId']],
                    Tags=[{'Key': 'MyID', 'Value': ''}]
                )
122
задан Keith Palmer Jr. 26 March 2009 в 16:14
поделиться

8 ответов

JAXB делает ТОЧНО, что Вы хотите. Это встроено в JRE/JDK, запускающийся в 1,6

119
ответ дан 24 November 2019 в 01:20
поделиться

XMLBeans сделает это. Конкретно команда "scomp".

Править: XMLBeans был ликвидирован, проверьте это сообщение stackoverflow на большее количество информации.

14
ответ дан 24 November 2019 в 01:20
поделиться

Если Вы хотите начать кодировать Java к XML и XML к Java меньше чем через 5 минут, попробуйте Простую Сериализацию XML. Не проводите часы, изучая API JAXB http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

Однако, если Вы действительно увлечены изучением JAXB, вот превосходный учебный http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml

Содержание учебного руководства:

JAXB для простой СЕРИАЛИЗАЦИИ XML JAVA

Существует много способов сделать сериализацию XML в Java. Если Вы хотите мелкомодульное управление парсингом и сериализацией, можно пойти для SAX, DOM или Stax для лучшей производительности. Все же то, что я часто хочу сделать, является простым отображением между POJOs и XML. Однако создавая классы Java, чтобы сделать событие XML, анализирующее вручную, не тривиально. Я недавно нашел, что JAXB был быстрым и удобным отображением Java-XML или сериализацией.

JAXB содержит много полезных функций, можно проверить ссылочную реализацию здесь. Блог Kohsuke является также хорошим ресурсом для получения дополнительной информации о JAXB. Для этой записи в блоге я покажу Вам, как сделать простую СЕРИАЛИЗАЦИЮ XML JAVA с JAXB.

POJO к XML

Скажем, у меня есть объект Java Объекта. Я хочу сериализировать объект Объекта к формату XML. Что я должен сделать, сначала должен аннотировать этот POJO некоторыми аннотация XML от javax.xml.bind.annotation.* пакет. Посмотрите листинг кода 1 для Item.java

Из кода

  • @XmlRootElement(name="Item") указывает, что я хочу быть корневым элементом.
  • @XmlType(propOrder = {"name", "price"}) указывает на порядок, что я хочу, чтобы элемент был расположен в выводе XML.
  • @XmlAttribute(name="id", ...) указывает, что идентификатор является атрибутом для укоренения элемента.
  • @XmlElement(....) указывает, что я хочу, чтобы цена и имя были элементом в Объекте.

Мой Item.java готово. Я могу затем идти вперед и создать сценарий JAXB для маршалинга Объекта.

//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....

JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));

Поскольку полный листинг кода посмотрите Листинг кода 2 main.java. Выходной Листинг кода 3 item.xml файл создается. Это похоже на это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">

 <ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>

</ns1:item>

Легкое право? Можно альтернативно направить вывод XML как текстовая строка, Поток, Устройство записи, ContentHandler, и т.д. просто изменением параметр маршала (...) метод как

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);

XML к POJO

Давайте инвертируем процесс. Предположите, что у меня теперь есть часть строковых данных XML, и я хочу превратить их в объект Item.java. Данные XML (Листинг кода 3) похожи

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>

Я могу затем не упорядочить этот код XML к объекту Объекта

...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...

Поскольку полный листинг кода посмотрите Листинг кода 2 (main.java). Исходный код XML может прибыть во многие формы и от Потока и от файла. Единственной разницей, снова, является параметр метода:

...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);

Проверка с XML-схемой

Последняя вещь, которую я хочу упомянуть здесь, проверяет вход XML со схемой прежде, чем не упорядочить к объекту Java. Я создаю файл схемы XML, названный item.xsd. Поскольку полный листинг кода посмотрите Листинг кода 4 (Item.xsd). Теперь то, что я должен сделать, зарегистрировать эту схему для проверки.

...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...

Когда я пытаюсь не упорядочить данные XML к POJO, если вход, XML не приспосабливают схеме, исключение, будет пойман. Поскольку полный листинг кода посмотрите Листинг кода 5 (invalid_item.xml).

javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
                                not a valid value for 'integer'.]

Здесь я изменяю 'идентификационный' атрибут для строкового представления вместо целого числа.

Если вход XML будет допустим против схемы, то данные XML будут не упорядочены к объекту Item.java успешно.

37
ответ дан 24 November 2019 в 01:20
поделиться

Известный JAXB

Существует плагин знатока, который мог сделать это для Вас в любой фазе разработки, которую Вы хотите.

Вы могли сделать этот материал обоими способами: xsd <-> Java

2
ответ дан 24 November 2019 в 01:20
поделиться

Если Вы не возражаете пользоваться внешней библиотекой, я использовал Castor, чтобы сделать это в прошлом.

7
ответ дан 24 November 2019 в 01:20
поделиться

Разве XJC JAXB не является возможным ответом на этот вопрос? Я пытаюсь добиться того же. Тем не менее, все еще в стадии "попытки". Наткнулся на XJC, так подумал поделится.

4
ответ дан 24 November 2019 в 01:20
поделиться

Ограничение JAXB.

Я работал над JAXB, по моему мнению, это хороший способ работы с данными между объектами XML и Java. Положительные стороны - это проверенная и лучшая производительность и контроль над данными во время выполнения. При правильном использовании встроенных инструментов или скриптов это избавляет от множества усилий по написанию кода.

Я обнаружил, что часть настройки - это не сразу задача, и потратил часы на настройку среды разработки.

Однако я отказался от этого решения из-за глупого ограничения, с которым столкнулся. В моем определении схемы XML (XSD) есть атрибут / элемент с именем «значение», и я должен использовать XSD как есть. Это очень небольшое ограничение вынудило мой шаг привязки XJC завершиться неудачно с ошибкой «Значение свойства 'уже использовано».

Это связано с реализацией JAXB, процесс привязки пытается создать объекты Java из XSD, добавляя несколько атрибутов в каждый класс, и один из них является атрибутом значения. Когда он обработал мой XSD, он пожаловался, что уже существует свойство с таким именем.

5
ответ дан 24 November 2019 в 01:20
поделиться

Говоря об ограничении JAXB, решением при наличии одного и того же имени для разных атрибутов является добавление встроенных настроек jaxb в xsd:

+

. . обязательные декларации . .

или внешние настройки ...

Вы можете увидеть дополнительную информацию по: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html

1
ответ дан 24 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: