XStream: как позволить xstream.createObjectInputStream () искать определенный элемент - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь использовать XStream для импорта больших файлов XML (~ 1 ГБ).Я хочу использовать ObjectInputStream для чтения их в потоковом режиме, но мне нужно пропустить первый элемент, а затем переместить пару элементов вниз (см. Ниже, мне нужно импортировать элементы bag_LVC:Woonplaats).

Я ожидаю, что есть какой-то способ кормить xstream Reader или InputStream, который был найден в соответствии с моим интересующим элементом.Я пытался создать свой собственный HierarchicalStreamReader и переместить его в нужный элемент, но вы можете перемещаться только вверх и вниз:

HierarchicalStreamReader xpp = new XppDriver().createReader(xmlFile);
xpp.moveDown(); // moves to <xb:antwoord>
xpp.move(); // **would move to <xb:producten>, but it private**
xpp.moveDown(); // moves to <xb:producten>
xpp.moveDown(); // moves to <product_LVC:LVC-product>
st = xstream.createObjectInputStream(xpp);
BagWoonplaats bw = (BagWoonplaats) st.readObject();

Может ли xstream или любой из драйверов XPP каким-либо образом разрешитьВы ищете мой элемент интереса?

xml

<xb:BAG-Extract-Deelbestand-LVC>
  <xb:antwoord>
    <xb:vraag>
    <!-- more elements here -->
    </xb:vraag>
    <xb:producten>
      <product_LVC:LVC-product>
        <bag_LVC:Woonplaats>
          <!-- elements used as fields -->
        </bag_LVC:Woonplaats>
        <bag_LVC:Woonplaats>
          <!-- elements used as fields -->
        </bag_LVC:Woonplaats>
        <!-- and so on -->

1 Ответ

0 голосов
/ 18 февраля 2012

Решение этой проблемы было на самом деле очень тривиальным, и я почти смущен, но давайте все равно поделимся ответом для этой проблемы. Я не получил API для HierarchicalStreamReader, покопавшись в коде XStream, мне удалось обработать его, вот как это работает:

    HierarchicalStreamReader xpp = ...;
    while(xpp.hasMoreChildren()) {
        xpp.moveDown();
        // do something with the child element, and recursive into this again if appropriate
        xpp.moveUp();
    }

Это рекурсивный метод, который я сейчас использую для поиска соответствующего элемента. Местоположение определяется своего рода выражением xpath (конечно, очень базовым), которое я заранее нормализовал, в ArrayList:

private void seekToElement(HierarchicalStreamReader xpp, ArrayList<String> xpathishArray) {
    while(xpp.hasMoreChildren()) {
        xpp.moveDown();
        if(xpp.getNodeName().equals(xpathishArray.get(0))) {
            if(xpathishArray.size() > 1) {
                xpathishArray.remove(0);
                seekToElement(xpp, xpathishArray);
            }
            return;
        }
        xpp.moveUp();
    }
}
...