Создание классов C # из схемы XML, использующей JAXB (архитектура Java для привязки XML) - PullRequest
1 голос
/ 21 января 2010

У меня есть несколько схем XML, которые используют разметку JAXB (Java Architecture для XML Binding), аналогично следующему:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="1.0">
  <xs:element name="H">
    <xs:annotation>
      <xs:appinfo>
        <jxb:class name="Header" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="X" minOccurs="1" maxOccurs="1">
          <xs:annotation>
            <xs:appinfo>
              <jxb:property name="SessionControl"/>
            </xs:appinfo>
          </xs:annotation>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="X" type="xs:string">
    <xs:annotation>
      <xs:appinfo>
        <jxb:class name="SessionControl"/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>
</xs:schema>

Из них мне нужно создать классы C #.

Запуск xsd.exe в приведенной выше схеме приводит к следующему (некоторые атрибуты удалены для ясности):

[XmlRoot(Namespace = "", IsNullable = false)]
public partial class H
{
    private string xField;

    public string X
    {
        get { return this.xField; }
        set { this.xField = value; }
    }
}

Ясно, что это не идеально - мне нужно учитывать разметку jxb:class и jxb:property в схеме, давая мне класс, который использует более читаемые имена jxb, но сериализуется в односимвольный элементы / атрибуты, указанные в схеме.

, например

[XmlRoot(Namespace = "", IsNullable = false, ElementName = "H")]
public partial class Header
{
    private string xField;

    [XmlElement(ElementName = "X")]
    public string SessionControl
    {
        get { return this.xField; }
        set { this.xField = value; }
    }
}

Есть ли разумный путь для достижения этого?

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Я знаю, что на стороне java можно сообщить процессору jaxb о дополнительной информации о привязке тремя различными способами:

  1. В самом xsd, как вы представили в своем вопросе.
  2. В отдельном XML-файле, который использует инструмент.
  3. В аннотациях к самим классам Java.

Все эти способы семантически эквивалентны - так что, строго говоря, теги не являются частью контракта xsd. Можно использовать варианты 2. или 3. выше, чтобы создать немного другой код Java, но с тем же контрактом xsd и wsdl.

Я ожидаю, что подобный механизм будет существовать в наборе инструментов на стороне .NET. Я предлагаю вам найти ссылку на файл xsd.exe и связанную с ним информацию, чтобы узнать, какая поддержка существует для настройки сгенерированного кода (извините, я не могу помочь больше, я не знаком с этим инструментом).

0 голосов
/ 05 февраля 2010

Подход, который мы использовали для этого, заключался в том, чтобы просто выполнить работу вручную - из сгенерированного xsd.exe C # -источника, используя xsd-файлы в качестве ссылки.

...