Правильный способ построения этого XML с использованием Xstream

#java #xml #xstream

#java #xml #xstream

Вопрос:

Я пытаюсь добиться следующего, используя XStream:

 <?xml version="1.0" encoding="UTF-8"?>
<rows>
    <row id="EventID">
        <cell>false</cell>
        <cell>Mainland</cell>
        <cell></cell>
        <cell></cell>

        <row id = "StoreID">
            <cell></cell>
            <cell></cell>
            <cell></cell>
            <cell></cell>
        </row>

    </row>
</rows>
 

Здесь мы можем видеть, что строка с идентификатором «StoreID» на самом деле является дочерней строкой строки «EventID». Я могу создать оба по отдельности, выполнив следующее:

     String xml = "", eventXML = "", storeXml = "";
    StringBuffer buff = new StringBuffer(1000);
    buff.append("<?xml version='1.0' encoding='iso-8859-1'?>");

    XStream xstream = new XStream(new DomDriver());


    xstream.alias("rows", List.class);
    xstream.alias("row", Event.class);

    xstream.registerConverter(evtConverter);

    for( Event e: events )
    {
        // Get a list of stores
        Store store = e.getStore();
        xstream.registerConverter( storeConverter, XStream.PRIORITY_VERY_HIGH );

        xstream.alias("row", Store.class);
        storeXml = xstream.toXML( store );

        xml = xstream.toXML(e);
    }
    return xml;
 

Итак, как я могу их объединить? Есть ли способ остановить автоматическое закрытие xml (объекта события), чтобы я мог добавить в хранилище xml?

Спасибо

Ответ №1:

Для этого мне пришлось действительно разбавить все до базовых строк. Я создал метод, который объединяет строки xml вместе:

 private static String combineStrings(String eventXML, String storeXML) {
    String newXML = "";

    Pattern pattern = Pattern.compile("</row>");
    Matcher matcher = pattern.matcher(eventXML);

    int posForStoreXML = 0;

    boolean found = false;
    while (matcher.find()) {
        posForStoreXML = matcher.start() - 1;
        found = true;
    }
    if (!found) {
        System.err.println("No match found");
    }

    StringBuilder builder = new StringBuilder(eventXML);
    builder.insert(posForStoreXML, storeXML);

    System.out.println(builder.toString());
    newXML = builder.toString();

    return newXML;
}
 

Это должно было быть вызвано здесь:

 for (Event_BACKUP e : events) {
        // Get a list of stores
        Store store = e.getStore();
        xstream.registerConverter(storeConverter,
                XStream.PRIORITY_VERY_HIGH);
        xstream.alias("row", Store.class);

        storeXml = xstream.toXML(store);
        xml = xstream.toXML(e);
        **xml = combineStrings(xml, storeXml);**

        buffer.append(xml);
    }
    buffer.append( "</rows>" );
    xml = buffer.toString();