0

我正在尝试使用 XStream 导入大型 XML 文件(~ 1 GB)。我想使用 anObjectInputStream来读取它们的流,但我需要跳过第一个元素,然后向下移动几个元素(见下文,我需要导入bag_LVC:Woonplaats元素)。

我希望有某种方法可以为我感兴趣的元素提供 xstream aReader或 a 。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 -->
4

1 回答 1

0

这个问题的解决方案其实很琐碎,我都快要尴尬了,不过还是分享一下这个问题的答案吧。我没有得到 HierarchicalStreamReader 的 API,在挖掘了 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();
    }
}
于 2012-02-18T17:00:59.447 回答