Кастор - Разоблачение простой повторяющейся группы - PullRequest
2 голосов
/ 06 декабря 2011

Я медленно схожу с ума из-за этого. Я пытаюсь разобрать XML-документ следующим образом:

<GetDeadlineOffset>
    <deadlineCode>DC1</deadlineCode>
    <parameters>
      <parameter name="P1">Param 1</parameter>
      <parameter name="P2">Param 2</parameter>
    </parameters>
</GetDeadlineOffset>

У меня есть пара простых POJO, GetDeadlineOffsetRequest и Parameter, которые выглядят так:

public class GetDeadlineOffsetRequest {

    private String deadlineCode = null;
    private List<Parameter> parmList = new ArrayList<Parameter>();


    public GetDeadlineOffsetRequest() {
        // Do nothing
    }

    public String getDeadlineCode(){
        return this.deadlineCode;
    }

    public void setDeadlineCode(String deadlineCode){
        this.deadlineCode = deadlineCode;
    }

    public List<Parameter> getParameters() {
        return parmList;
    }

    public void setParameters(List<Parameter> parmList) {
        this.parmList = parmList;
    }

} 

и

public class Parameter {

    private String name = null;
    private String value = null;

    public Parameter() {
        // Do Nothing
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

Я использую файл сопоставления, но, похоже, не могу получить эти теги в моем списке параметров.

Это моя последняя попытка картирования:

<class name="mypkg.GetDeadlineOffsetRequest">
    <map-to xml="GetDeadlineOffset"/>
    <field name="DeadlineCode" type="java.lang.String">
        <bind-xml name="deadlineCode" node="element" />
    </field>
    <field name="Parameters" type="mypkg.Parameter" collection="collection">
        <bind-xml name="parameters" node="element" />
    </field>    
</class>
<class name="mypkg.Parameter">
    <map-to ns-uri="http://services.blah.com/AMM/Deadline/v1"/>
    <field name="Value" type="java.lang.String">
        <bind-xml name="parameter" node="element" /> 
    </field>
    <field name="Name" type="java.lang.String">
        <bind-xml name="name" node="attribute" location="parameter" />  
    </field>
</class>

Проблема, похоже, заключается в том, что является элементом контейнера, а является повторяемым элементом. Отображение выше говорит Кастору, что повторяется.

Я уже пару дней пробую всевозможные комбинации отображений и думаю, что пробился в угол!

Кто-нибудь может увидеть, что я делаю не так?

Я использую Castor XML 1.3.2.

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Мне удалось добиться некоторого успеха со следующим отображением:

<class name="myPkg.GetDeadlineOffsetRequest">
    <map-to xml="GetDeadlineOffset"/>
    <field name="DeadlineCode">
        <bind-xml name="deadlineCode" />
    </field>
    <field name="parameters" type="myPkg.Parameter" collection="collection">
        <bind-xml name="parameter" location="parameters">
            <class name="myPkg.Parameter">
                <field name="Name">
                    <bind-xml name="name" node="attribute" />
                </field>
                <field name="Value">
                    <bind-xml node="text"/>
                </field>
            </class>
        </bind-xml>
    </field>        
</class>

Хитрость заключалась в том, чтобы использовать location = "parameters" и node = "text" для пары элементов bind-xml .Я успешно использовал маршаллирование и демаршаллирование, используя это отображение.

1 голос
/ 07 декабря 2011

Имеете ли вы какой-либо контроль над форматом XML, который вы пытаетесь прочитать, или он должен быть в этом формате?

<GetDeadlineOffset>
    <deadlineCode>DC1</deadlineCode>
    <parameters>
      <parameter name="P1">Param 1</parameter>
      <parameter name="P2">Param 2</parameter>
    </parameters>
</GetDeadlineOffset>

Мне удалось вывести этот формат для записи, но Кастор не смогчитать его обратно в исключение.

Самое близкое, что я мог бы найти, где он успешно маршал и немаршал, это:

<GetDeadlineOffset>
    <deadlineCode>DeadlineCode</deadlineCode>
    <parameters>
        <parameter name="Name1" value="Value1"/>
        <parameter name="Name2" value="Value2"/>
    </parameters>
</GetDeadlineOffset>
...