SimpleXML Framework возвращает все вложенные элементы

1

У меня есть xml-документ следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Calculations>
    <desc>Calculations Description</desc>
    <Calculation operator="ADD" valueA="1" valueB="2">
        <desc>First Description</desc>
        <owners>
        <owner id="1"><name>Alan</name></owner>
        <owner id="2"><name>Karen</name></owner>
        <owner id="3"><name>Isla</name></owner>
        <owner id="4"><name>Bethany</name></owner>
        </owners>
    </Calculation>
    <Calculation operator="SUBTRACT" valueA="3" valueB="1">
        <desc>Second Description</desc>
        <owners>
        <owner id="10"><name>Christopher</name></owner>
        <owner id="11"><name>David</name></owner>
        <owner id="12"><name>Matt</name></owner>
        <owner id="13"><name>Peter</name></owner>
        </owners>
        </Calculation>
    <Calculation operator="MULTIPLY" valueA="2" valueB="5">
        <desc>Third Description</desc>
        <owners>
        <owner id="10"><name>Christopher</name></owner>
            <owner id="11"><name>David</name></owner>
            <owner id="12"><name>Matt</name></owner>
            <owner id="13"><name>Peter</name></owner>
        </owners>
                </Calculation>
    <Calculation operator="DIVIDE" valueA="2" valueB="5">
        <desc>Fourth Description</desc>
        <owners>
        <owner id="10"><name>Christopher</name></owner>
            <owner id="11"><name>David</name></owner>
            <owner id="12"><name>Matt</name></owner>
            <owner id="13"><name>Peter</name></owner>
        </owners>
                </Calculation>
</Calculations>

Я пытаюсь десериализировать его, используя следующие классы Java:

Calculations.java:

package Simple;

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

@Root(name="Calculations")
public class Calculations {

    @Element(name="desc")
       private String text;

    @ElementList(inline=true)
       public static List<Calculation> calculations;


       public Calculations() {
          super();
       }  
       public List<Calculation> getCalculations() {
              return calculations;
           }
        public String getDescription() {
              return text;
           }

}

Calculation.java:

package Simple;

import java.util.List;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

@Root(name="Calculation")
public class Calculation {
    public Calculation() {
        super();
    }

    @Attribute(name="operator")
       private String operator;


    @ElementList
       public static List<Owner> owners;

    public String getOperator() {
          return operator;
       }

  public List<Owner> getOwners() {
          return owners;
       }

}

и owner.java:

package Simple;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name="Owner")
public class Owner {
    public Owner() {
        super();
    }

    @Attribute(name="id")
       private String id;

    @Element(name="name")
    private String name;

    public String getID() {
          return id;
       }

    public String getName() {
          return name;
       }
}

У меня он работает успешно (в основном) - на данный момент он просто в тестовом проекте, и я пишу подробности на консоль с несколькими циклами.

Проблема заключается в том, что когда я распечатываю его, вместо каждого "Расчет", имеющего 4 владельца, то, что возвращается, состоит в том, что каждый расчет имеет 16 владельцев - все 16 владельцев возвращаются для каждого расчета, как показано на моей консоли:

ADD
 - Alan
 - Karen
 - Isla
 - Bethany
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
SUBTRACT
 - Alan
 - Karen
 - Isla
 - Bethany
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
MULTIPLY
 - Alan
 - Karen
 - Isla
 - Bethany
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
DIVIDE
 - Alan
 - Karen
 - Isla
 - Bethany
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
 - Christopher
 - David
 - Matt
 - Peter
end

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

Я предположил, что, когда процесс "чтения" повторяется через это, поскольку он входит в каждый расчет, он просто выбирает владельцев из этой итерации, но по какой-то причине он добавляет все их к каждому вычислению.

Буду признателен за любую помощь, которую вы можете дать.

Благодаря,

Алан

  • 0
    Вы должны использовать статические поля списка? Почему не экземпляры полей?
Теги:
nested
simple-framework

1 ответ

0
Лучший ответ

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


т.е. измените это:

@ElementList
public static List<Owner> owners;

к этому:

@ElementList
public List<Owner> owners; // not static

и то же самое для изменения этого:

@ElementList(inline=true)
public static List<Calculation> calculations;

к этому:

@ElementList(inline=true)
public List<Calculation> calculations;

Статично, все экземпляры класса будут иметь один и тот же список, то есть все экземпляры Calculation будут иметь тот же список владельцев, и это может быть источником проблем для вас. Также вы должны серьезно подумать о том, чтобы сделать поля выше приватных и разрешить доступ только через геттеры и сеттеры. Позже вы можете захотеть только выпустить глубокую копию исходного списка, и это может быть выполнено только в том случае, если вы ограничиваете прямой доступ к полям.

  • 0
    Это сразу решило проблему, спасибо, я очень благодарен. Благодарен также за быстрый обзор последствий как статических, так и публичных / приватных. Первоначально они были настроены как приватные, я только установил их как публичные, просто чтобы посмотреть, изменит ли это какую-то проблему в моей проблеме (и я просто не изменил их обратно). Это также побудит меня взглянуть дальше на значение «статического», которое я явно неправильно понял где-то вдоль линии. Еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню