#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();