Динамическое уничтожение XML в Java без использования базы данных - PullRequest
1 голос
/ 13 декабря 2011

Существует ли в Java «стандартизированный» способ (т. Е. Шаблон кода или, что еще лучше, библиотека с открытым исходным кодом) для динамического выравнивания («измельчения») иерархического XML файла большого размера инеизвестная структура, с выходом, не перенаправленным в СУБД, но напрямую доступным?

Я смотрю на преобразование, подобное упомянутому в в этом вопросе , но все примеры кода, которые я видел, используют некоторыеКоманда SQL для ввода сглаженного XML-ввода в таблицу базы данных через СУБД (например, MySQL).

Что я хотел бы сделать, так это постепенно извлекать данные XML в строку или, по крайней мере, втекстовый файл, который впоследствии может быть подвергнут последующей обработке, без прохождения СУБД.

РЕДАКТИРОВАТЬ:

После дальнейшей работы над этой проблемой, есть несколькорешения, использующие XSLT (включая полностью параметризуемое) в в этом вопросе .

1 Ответ

2 голосов
/ 13 декабря 2011

Вы можете сделать это с JDOM (см. Пример ниже, jdom.jar должен быть на пути к классам). Но будьте осторожны, весь дом в памяти. Если XML больше, вы должны использовать XSLT или SAX-парсер.

import java.io.IOException;
import java.io.StringReader;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.junit.Test;

public class JDomFlatten {

@Test
public void testFlatten() {
    final String xml = "<grandparent name=\"grandpa bob\">"//
            + "<parent name=\"papa john\">"//
            + "<children>"//
            + "<child name=\"mark\" />"//
            + "<child name=\"cindy\" />"//
            + "</children>"//
            + "</parent>"//
            + "<parent name=\"papa henry\">"// 
            + "<children>" //
            + "<child name=\"mary\" />"//
            + "</children>"//
            + "</parent>" //
            + "</grandparent>";
    final StringReader stringReader = new StringReader(xml);
    final SAXBuilder builder = new SAXBuilder();
    try {
        final Document document = builder.build(stringReader);
        final Element grandparentElement = document.getRootElement();
        final StringBuilder outString = new StringBuilder();
        for (final Object parentElementObject : grandparentElement.getChildren()) {
            final Element parentElement = (Element) parentElementObject;
            for (final Object childrenElementObject : parentElement.getChildren()) {
                final Element childrenElement = (Element) childrenElementObject;
                for (final Object childElementObject : childrenElement.getChildren()) {
                    final Element childElement = (Element) childElementObject;

                    outString.append(grandparentElement.getAttributeValue("name"));
                    outString.append(" ");
                    outString.append(parentElement.getAttributeValue("name"));
                    outString.append(" ");
                    outString.append(childElement.getAttributeValue("name"));
                    outString.append("\n");
                }
            }

        }
        System.out.println(outString);

    } catch (final JDOMException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (final IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...