Java-методы для опроса файлов XSD - PullRequest
5 голосов
/ 29 октября 2011

У меня есть набор файлов xsd для разных типов данных. Как лучше всего создать список свойств типов в мире Java?

например. с этими двумя файлами.

файл: customer.xsd

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="number" type="xs:integer"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

файл: order.xsd

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderid" type="xs:integer"/>
      <xs:element name="customer" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

Я бы хотел сделать две вещи

1. Java-приложение, которое читает в XSD и затем обрабатывает (каким-то образом?). Поэтому, когда вы запускаете программу, она может распечатать свойства

> java -jar printtypes.jar -f customer.xsd
> number : Integer
> name : String
> address : String

2. какое-то преобразование, которое генерирует новый файл

файл: customer.properties

<propertylist>
<prop>
 <name> orderid </name>
 <type> integer </type>
</prop>
<prop>
 <name> customer </name>
 <type> string</type>
</prop>
</propertylist>

Я пытался реализовать программу в (1) выше, используя отражение Java для опроса классов Java, сгенерированных JAXB. Это создало экземпляр класса и опросило значения и поля, но это не работает, когда значения состоят из пустой последовательности. Невозможно вернуться к исходному типу значения из-за стирания типа. В итоге вы получите пустой ArrayList чего-то, но вы не знаете что.

Я работаю в C ++, поэтому на данный момент я немного растерялся со всей этой технологией Java. Мои возможности Google подвели меня - большинство сообщений JAVA / XSD, о которых я слышал, говорят о проверке, а это не то, что я хочу делать.

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Возможно, вы захотите заглянуть в XSOM, это проект, который будет принимать вашу XML-схему и создавать объекты, которые вы можете перемещать и получать желаемые результаты.

http://xsom.java.net/userguide.html

Анализ схемы вручную может быть очень сложным, потому что могут быть разные способы сказать одно и то же.

2 голосов
/ 29 октября 2011

Проблема 1. может быть решена с помощью XPath . Например, это выражение:

/xs:schema/xs:element/xs:complexType/xs:sequence/xs:element/@name

вернет все имена:

  • number
  • name
  • address

См. Также: Документ - Как получить значение тега по его имени?

Для , задача 2. XSLT идеально подходит. Вот быстрое и грязное преобразование:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/xs:schema/xs:element/xs:complexType/xs:sequence">
<propertylist>
    <xsl:for-each select="xs:element">
    <prop>
        <name><xsl:value-of select="@name"/></name>
        <type><xsl:value-of select="@type"/></type>
    </prop>
    </xsl:for-each>
</propertylist>
</xsl:template>
</xsl:stylesheet>

При применении к customer.xsd это дает:

<propertylist xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <prop>
        <name>number</name>
        <type>xs:integer</type>
    </prop>
    <prop>
        <name>name</name>
        <type>xs:string</type>
    </prop>
    <prop>
        <name>address</name>
        <type>xs:string</type>
    </prop>
</propertylist>

Интересно, что вам не нужна Java для обеих ваших проблем.

1 голос
/ 31 октября 2011

XSOM, как предложено выше, является одним из подходов.

Другим подходом является Саксонский SCM. Процессор схемы Saxon считывает набор документов схемы и выводит соответствующую модель компонента схемы в XML-представление, называемое SCM. Тогда это гораздо более поддается обработке, чем исходные документы XSD. Возможно, XSOM имеет больше смысла, если вы хотите выполнить последующую обработку в Java, Saxon SCM имеет больше смысла, если вы хотите сделать это в XSLT или XQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...