Как показывает размер NodeList, компания-элемент имеет 5 дочерних узлов. Эти дочерние узлы:
- пустой текстовый узел перед первым штатным узлом
- первый штатный узел
- пустой текстовый узел между двумя штатными узлами
- второй штатный узел
- пустой текстовый узел после второго штатного узла
Важность этих текстовых узлов может быть более заметна, если вы думаете, следующий вид документа:
<?xml version="1.0"?>
<company>
text before first staff-node
<staff>
<firstname>test</firstname>
<lastname>test2</lastname>
<nickname>test3</nickname>
<salary>test4</salary>
</staff>
text between staff-nodes
<staff>
<firstname>test5</firstname>
<lastname>test6</lastname>
<nickname>test7</nickname>
<salary>test8</salary>
</staff>
text after second staff-node
</company>
Если вы хотите иметь Nodelist, содержащий только штатные узлы, вы можете получить его с помощью следующего:
NodeList staffNodes = topLevelElement.getElementsByTagName("staff");
Ответ на вопрос после редактирования:
Ваш второй подход:
NodeList firstNameElements = companyElement.getElementsByTagName("firstname");
терпит неудачу, потому что вы вызываете метод для неправильного элемента уровня. Как видите, вы пытаетесь получить имя дочернего элемента companyElement. Но нет ни одного. Как и в начале, у компании есть пять дочерних узлов, которые были перечислены ранее. Если вас интересуют дочерние узлы staff-element, то вы должны использовать их как элемент персонала, что-то вроде:
org.w3c.dom.Element n = (org.w3c.dom.Element) staffNodes.item(i);
NodeList firstNameElements = n.getElementsByTagName("firstname");
Если у вас есть время для изучения основ этого предмета, чтение этой главы из учебника JAXP может быть полезным. Если вам нужен пример, который хорошо подходит для вашего случая, его можно найти по здесь