Найти, существует ли узел в API XStream - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть XML структура, похожая на следующую.У меня есть конвертеры для записи каждого объекта A, B и C.Можно ли в XStream проверить, существует ли узел в иерархии XML?то есть в случае ниже, я хочу сделать что-то, если узел B существует до того, как я напишу C.

<A>
    <B>
        <C>
        </C>
    </B>
</A>    

1 Ответ

0 голосов
/ 09 февраля 2019

Если я правильно понимаю, вы хотите проверить в CConverter, существует ли узел B в иерархии.Если структура такая, как указано выше, это всегда true.Процесс сортировки начинается с корневого объекта и переходит во внутренние свойства.Итак, чтобы написать C узел сначала B должен существовать.

Предположим, у вас есть простая POJO структура, как показано ниже:

class A {
    public B b = new B();
}

class B {
    public C c = new C();
}

class C {

}

Теперь мы можем реализовать конвертер для A и B:

class AConverter implements Converter {

    public boolean canConvert(Class clazz) {
        return clazz.equals(A.class);
    }

    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
        System.out.println("Marshalling A!");
        A a = (A) value;
        if (a.b != null) {
            writer.startNode("B");
            context.convertAnother(a.b);
            writer.endNode();
        }
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        throw new NotImplementedException();
    }
}

class BConverter implements Converter {

    public boolean canConvert(Class clazz) {
        return clazz.equals(B.class);
    }

    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
        System.out.println("Marshalling B!");
        B b = (B) value;
        if (b.c != null) {
            writer.startNode("C");
            context.convertAnother(b.c);
            writer.endNode();
        }
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        throw new NotImplementedException();
    }
}

Main класс:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;

public class XStreamApp {
    public static void main(String[] args) {
        XStream xStream = new XStream();
        xStream.registerConverter(new AConverter());
        xStream.registerConverter(new BConverter());
        xStream.alias("A", A.class);

        System.out.println(xStream.toXML(new A()));
    }
}

Отпечатки:

Marshalling A!
Marshalling B!
<A>
  <B>
    <C/>
  </B>
</A>
...