private void traverseNodeObject(NodeObject node, List<DataElement> dataElements)
                throws TikaException, IOException {
            if (node instanceof IntermediateNodeObject) {
                IntermediateNodeObject intermediateNodeObject = (IntermediateNodeObject) node;
                ObjectGroupDataElementData data = new ObjectGroupDataElementData();
                data.objectGroupDeclarations.objectDeclarationList.add(
                        this.createObjectDeclare(node));
                data.objectGroupData.objectGroupObjectDataList.add(
                        this.createObjectData((IntermediateNodeObject) node));

                dataElements.add(new DataElement(DataElementType.ObjectGroupDataElementData, data));

                for (LeafNodeObject child : intermediateNodeObject.intermediateNodeObjectList) {
                    this.traverseNodeObject(child, dataElements);
                }
            } else if (node instanceof LeafNodeObject) {
                LeafNodeObject intermediateNode = (LeafNodeObject) node;

                ObjectGroupDataElementData data = new ObjectGroupDataElementData();
                data.objectGroupDeclarations.objectDeclarationList.add(
                        this.createObjectDeclare(node));
                data.objectGroupData.objectGroupObjectDataList.add(
                        this.createObjectData(intermediateNode));

                if (intermediateNode.dataNodeObjectData != null) {
                    data.objectGroupDeclarations.objectDeclarationList.add(
                            this.createObjectDeclare(intermediateNode.dataNodeObjectData));
                    data.objectGroupData.objectGroupObjectDataList.add(
                            this.createObjectData(intermediateNode.dataNodeObjectData));
                    dataElements.add(
                            new DataElement(DataElementType.ObjectGroupDataElementData, data));
                    return;
                }

                if (intermediateNode.dataNodeObjectData == null &&
                        intermediateNode.intermediateNodeObjectList != null) {
                    dataElements.add(
                            new DataElement(DataElementType.ObjectGroupDataElementData, data));

                    for (LeafNodeObject child : intermediateNode.intermediateNodeObjectList) {
                        this.traverseNodeObject(child, dataElements);
                    }

                    return;
                }

                throw new TikaException(
                        "The DataNodeObjectData and IntermediateNodeObjectList properties in " +
                                "LeafNodeObjectData type cannot be null in the same time.");
            }
        }
This method is used to travel the node tree and build the ObjectGroupDataElementData
and the extra data element list

@param node         Specify the object node.
@param dataElements Specify the list of data elements.
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/streamobj/ObjectGroupDataElementData.java