Использование Castor для классов с одним значением - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть XML для загрузки, который настроен так

<project>
    <client>Some client</client>
    <description>some description</description>
</project>

Объекты, которые мне нужны для разбора этих данных, это Project и Client. Как мне настроить отображение касторов для этого?

<class name="Project">
  <field name="description" type="string" />
  <field name="client" type="Client" />
</class>

Если я использовал вышеизложенное и у меня есть конструктор, который принимает строку, нужно ли мне также выполнять сопоставление для класса Client - если так, как это будет выглядеть?

1 Ответ

0 голосов
/ 23 марта 2011

Вполне возможно, что по умолчанию Castor - используя интроспекцию для получения списка полей с помощью методов getter / setter и генерацию XML-тегов на основе имен классов и членов, будет выполнять большую часть того, что вы хотите.Однако вы, вероятно, обнаружите, что вам, возможно, придется настроить его, чтобы убедиться в таких вещах, как порядок тегов в выходных данных и точное форматирование.

Важные элементы, которые необходимо добавитьявляются map-to определениями XML для каждого класса (что позволяет каждому узлу XML быть демаршалированными в правильный класс) и bind-xml узлами для каждого поля, чтобы поля могли отображаться в правильное местоположение.Есть еще одно изменение, которое вы внесете в поле client - вы заметите, что значение поля во входящих данных для клиента отображается не как дочерний элемент узла client, а как дочерний элемент узла project,Вы можете сделать это, указав container="true", что означает, что класс не будет отображаться, только его поля.

(не проверено) что-то вроде этого, при условии, что ваша строка клиента собирается в поле с именем name.

<class name="Project">
 <map-to xml="project"/>
 <field name="client" type="Client" container="true"/>
 <field name="description" type="string"><bind-xml name="description"/></field>
</class>
<class name="Client">
 <field name="name" type="string"><bind-xml name="client"/></field>
</class>
...