Обработка XML-файла в Java, путаница в узлах

Я пытаюсь разобрать XML-файл на Java, и он работает нормально, но я не совсем понимаю, почему. У меня есть следующий код (я только что вырезал важные вещи):

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

Document document = builder.parse(new File(fileName));

NodeList nodeList = document.getDocumentElement().getChildNodes();

for (int i = 0; i < nodeList.getLength(); i++)
  {
   Node node = nodeList.item(i);

   if (node.getNodeType() == Node.ELEMENT_NODE) {
   Element elem = (Element) node;

   // Get the value of all sub-elements.
   String original = elem.getElementsByTagName("Original")
         .item(0).getChildNodes().item(0).getNodeValue();

   String translation = elem.getElementsByTagName("Translation").item(0)
         .getChildNodes().item(0).getNodeValue();

   Integer score = Integer.parseInt(elem.getElementsByTagName("Score")
         .item(0).getChildNodes().item(0).getNodeValue());
}

Мой XML прост:

<?xml version="1.0" encoding="UTF-8"?>
    <Dictionary>
         <Word>
              <Original>die Unterwäsche</Original >
              <Translation>Bielizna</Translation>
              <Score>-4</Score>
         </Word>
         <Word>
              <Original>die Müche</Original>
              <Translation>Fatyga, trud</Translation>
              <Score>0</Score>
         </Word>
         <Word>
              <Original>wetten</Original>
              <Translation>założyć się</Translation>
              <Score>-6</Score>
         </Word>
         <Word>
              <Original>umsonst</Original>
              <Translation>Bez powodu</Translation>
              <Score>0</Score>
         </Word>
    </Dictionary>

Большой вопрос: почему у меня 9 узлов при вызове nodeList.getLength ()? Я распечатал их, и 4 - это элементы (вроде нормально), а 5 других - текстовые узлы, но я не совсем понимаю, что они из себя представляют. И почему Node привязан к Element?

Во-вторых, эта часть:

elem.getElementsByTagName("Score")
         .item(0).getChildNodes().item(0).getNodeValue());

Я вызываю элемент (0) на найденном узле, но опять же, что это практически?

Я был бы очень признателен за вашу помощь, я довольно новичок, и я уже некоторое время борюсь с этим. Публикация пошагового руководства о том, что есть в перечисленных частях моего XML, означала бы для меня целый мир.


person KKeff    schedule 10.05.2015    source источник
comment
что такое builder и что document?   -  person ThisClark    schedule 11.05.2015
comment
Я добавил соответствующие строки, извините.   -  person KKeff    schedule 11.05.2015


Ответы (1)


почему у меня 9 узлов при вызове nodeList.getLength ()?

9 узлов:

1 из ‹Document>
4 из ‹Word>
4 из всего между ‹Word>

5 других - текстовые узлы, но я не совсем понимаю, что они собой представляют.

<?xml version="1.0" encoding="UTF-8"?>
<Dictionary>                         <-- null text
    <Word>                           <-- null text
        <Original>...
        <Translation>...
        <Score>...
    </Word>
    <Word>                           <-- null text
        <Original>...
        <Translation>...
        <Score>...
    </Word>
    <Word>                           <-- null text
        <Original>...
        <Translation>...
        <Score>...
    </Word>
    <Word>                           <-- null text
        <Original>...
        <Translation>...
        <Score>...
    </Word>
</Dictionary>

И почему Node привязан к Element?

Чтобы ответить на эту последнюю часть, я отсылаю вас к другому сообщению: В чем разница между элементом и узлом в XML?

person ThisClark    schedule 11.05.2015
comment
Спасибо, @ThisClark, теперь это ясно. Я заметил еще одну вещь: вместо этого: (elem.getElementsByTagName("Score") .item(0).getChildNodes().item(0).getNodeValue());) я могу использовать: (elem.getElementsByTagName("Score") .item(0).getTextContent());) И это работает. Все еще в порядке? - person KKeff; 13.05.2015
comment
Если это работает для ваших нужд, это абсолютно нормально. Если вы ищете более эффективные способы работы с XML, вам придется больше узнать об этой теме и практиковать различные подходы, пока вы не почувствуете себя более комфортно. Посмотрите на реализации в SAX и StAX. - person ThisClark; 14.05.2015