If you use dom and that you use getElementsByTagName() to get to "Item", you can't avoid that outcome as the method basically flatten out the xml and identifies the match disregard the depth of the node in the hierachy, effectively resulting in 9 entries in the NodeList. However, if you use another method getChildNodes() again of dom, effectively that matches only one level downward in the hierachy but the method does not have an overload of locating a specific tag name as child (because, child might be text or element or comment etc...). Other frameworks may have specific ways to make effectively getChildNodes accepting a tag name as argument, but that is not dom per se.
But to arrive at what you want with only a reasonable performance impact you can do this.
 using getElementsByTagName()
 use getChildNodes()
If the sample reflects faithfully the real document in the aspect of only Item be the child of TravellerInfo, probably  would be a better solution. If the sample does not reflect faithfully the strict Item/Item structure, then the condition in  would be insufficient and might be difficult to get a reasonably simple conditional for screening. In any case,  seems better suite to your need balancing all considerations.
subject: How to traverse <Item> node in <TravellerInfo> without considering “<Item>” node which is child node