2010-07-09 2 views
0

Я пытаюсь сгладить выход xml xstream с помощью конвертера/маршалинга без везения. Например,xstream flatten a object

public class A{ 
    public B b; 
    public int F; 
    public String G; 
} 

public class B{ 
    public String C; 
    public String D; 
    public int E; 
} 

выводится как

<A> 
    <B> 
    <C></C> 
    <D></D> 
    <E></E> 
    </B> 
    <F></F> 
    <G></G> 
</A> 

, но мне нужно

<A> 
    <C></C> 
    <D></D> 
    <E></E> 
    <F></F> 
    <G></G> 
</A> 

это возможно? Как избавиться от B? (C, D, E обозначены однозначно). Благодарю. Моя попытка до сих пор был

...  
public void marshal(Object value, HierarchicalStreamWriter writer, 
    MarshallingContext context) 
{ 
    B b = (B) value; 
    writer.startNode("C"); 
    writer.setValue(b.getC()); 
    writer.endNode(); 

    writer.startNode("D"); 
    writer.setValue(b.getD()); 
    writer.endNode(); 

    writer.startNode("E"); 
    writer.setValue(b.getE()); 
    writer.endNode(); 
} 

ответ

0

В зависимости от того, как связаны вы с XStream, вы можете сделать это довольно легко в EclipseLink MOXy используя @XmlPath аннотацию:

public class A{ 
    @XmlPath(".") public B b; 
    public int F; 
    public String G; 
} 

public class B{ 
    public String C; 
    public String D; 
    public int E; 
} 

Для информации о отображения на основе Moxy в XPath см:

+0

Спасибо, но перед swi tching существующий код для MOXy, я надеюсь найти одинаково приятное решение в XStream (о котором я просто не знаю) –

+0

Не проблема, не стесняйтесь обращаться ко мне, когда вы дойдете до точки, когда хотите порт :) , –

+0

Посмотрите мой пост в блоге, сравнивая JAXB & XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

0

Я нашел временное решение, хотя это не самый лучший.

Если я установил функцию canConvert для проверки окружающего объекта A вместо B, я могу управлять всем внутренним объектом.

public boolean canConvert(Class c) 
{ 
    return A.class == c; 
} 

Так как я должен определить все класс А, это намного больше работы (особенно в режиме реального объекта XML, вместо моего надуманного примера). Кто-нибудь знает, как получить тот же результат, используя конвертер только для внутреннего класса B?

public boolean canConvert(Class c) 
{ 
    return B.class == c; 
}