unmarshalling @XMLElement с тем же атрибутом имени - PullRequest
1 голос
/ 25 июля 2011

Я пытаюсь использовать JAXB для приложения, которое уже пишет XML в определенном формате.Я должен придерживаться формата для проблем обратной совместимости.

У меня есть следующий сегмент кода в классе:

@XmlElement( name = "field" )
private StudyIdentifier2 studyIdentifier;

@XmlElement( name = "field" )
private List<GenericField> demographicsFields = new ArrayList<GenericField>();

Этот код будет правильно писать следующий XML:

    <field>
        <value>2</value>
        <XMLtag>id</XMLtag>
    </field>
    <field>
        <value>JAMES</value>
        <XMLtag>patient_name</XMLtag>
    </field>
    <field>
        <value>This is a test</value>
        <XMLtag>study_description</XMLtag>
    </field>

Однако, когда я пытаюсь разобрать его, я просто получаю свой StudyIdentifier2 объект, содержащий последние данные поля XML, study_description и demographicsFields ArrayList только что имеют нулевые значения.Я предполагаю, что это потому, что я указываю одно и то же значение имени в аннотации @XMLElement, поэтому оно не может быть правильно разобранно.Однако мне нужно, чтобы они оба назывались <field>.Можно ли дать им обоим одинаковые имена, или они должны быть разными, чтобы правильно разобрать их?

Вполне возможно, что это очень простое решение, мне еще предстоит полностью разобраться, как работает JAXB.

1 Ответ

0 голосов
/ 27 декабря 2011

В этом XML нет ничего, что можно было бы использовать для программного определения того, какой это тип «поля» (StudyIdentifier2 или GenericField).Я, вероятно, даже не смог бы организовать этот XML «вручную», игнорируя любые возможные ограничения или трудности с JAXB.

Трудно точно увидеть, что здесь происходит, не видя определения класса для GenericField,Однако, более чем вероятно, да, вам нужно будет дать им разные имена (изменить ваш XML и, вероятно, вызвать некоторые из проблем обратной совместимости, о которых вы упомянули), если вы хотите, чтобы это было «правильно» рассортировано.В качестве альтернативы, если GenericField может представлять все 3 поля из вашего образца XML, что если вы просто удалите studyIdentifier и позвольте demographicsFields представить все как для маршалинга, так и для демаршаллинга - после, возможно, переименования его в нечто более подходящее, например genericFields?

Теперь, если вы знаете, например, что StudyIdentifer2 всегда следует читать из 3-го <field/> в XML, а все остальное необходимо перейти в demographicsFields, уточните это в своем вопросе.и, возможно, мы сможем найти некоторые дополнительные опции.

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