2015-02-13 2 views
0

У меня есть структура документа, как это:Как НЕ deserialise вложенной документ XML с XStream

<MyDocument> 
    <MyChildDocument> 
     <SubElement> 
      ... 
     </SubElement> 
    </MyChildDocument> 
</MyDocument> 

Я хотел XStream к deserialise это к следующему объекту:

@XStreamAlias("MyDocument") 
public class MyDocument { 
    String myChildDocument; 

    public String getMyChildDocument() { 
     return myChildDocument; 
    } 

    public void setMyChildDocument(String str) { 
     myChildDocument = str; 
    } 
} 

В переменной myChildDocument должен содержаться полный дочерний документ в виде строки, содержащей теги.

Мне также нужно сделать сериализацию этого, избегая XStream из сущности, кодирующей XML-строку, содержащуюся в переменной myChildDocument.

Я смотрел на конвертеры, чтобы сделать это для меня, но не нашел хорошего способа это сделать. Есть идеи?

+0

Вы пытались использовать картофельную фабрику? – immibis

+0

(Вот как НЕ десериализовать вложенный XML-документ с помощью XStream) – immibis

+0

Извините, не следуя за вами на Картофеля ... любые ссылки? –

ответ

0

Мне удалось создать решение для этого с помощью пользовательского конвертера. Проще говоря, при сортировке, подайте XML-строку для MyChildDocument в читатель XML и используйте копир, чтобы передать это автору, который создает маршаллированный результат. Отмените процесс, когда unmarshalling входящий XML!

public class MyExchangeConverter implements Converter { 

    protected static XmlPullParser pullParser; 
    protected static XmlPullParser getPullParser() { 
     if (pullParser == null) { 
      try { 
       pullParser = XmlPullParserFactory.newInstance().newPullParser(); 
      } 
      catch (XmlPullParserException e) { } // Ah nuts! 
     } 
     return pullParser; 
    } 

    @Override 
    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) { 
     return MyDocument.class.equals(type); 
    } 

    @Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, 
      MarshallingContext context) { 
     MyDocument request = (MyDocument) source; 
     if (request.getMyChildDocument() != null) { 
      HierarchicalStreamReader reader; 
      reader = new XppReader(new StringReader(request.getMyChildDocument()), getPullParser()); 
      HierarchicalStreamCopier copier = new HierarchicalStreamCopier(); 
      copier.copy(reader, writer); 
     } 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, 
      UnmarshallingContext context) { 
     MyDocument response = new MyDocument(); 
     reader.moveDown(); 
     Writer out = new StringWriter(); 
     HierarchicalStreamWriter writer = new CompactWriter(out); 
     HierarchicalStreamCopier copier = new HierarchicalStreamCopier(); 
     copier.copy(reader, writer); 
     response.setMyChildDocument(out.toString()); 
     reader.moveUp(); 
     return response; 
    } 
} 

Некоторые из них (по праву) утверждают, что эта система в значительной степени открывает систему для инъекций инъекций XML. Правда, но для моего конкретного случая использования это не является риском, о котором я беспокоюсь. Просто что-то нужно знать, если кто-то планирует использовать это для доступа к внешним интерфейсам с неизвестными удаленными сторонами или с риском нападений «человек в середине». Вы были предупреждены!