Java читает XML с парсингом SAX - PullRequest
       12

Java читает XML с парсингом SAX

0 голосов
/ 22 сентября 2019

, поэтому я начал работать с xml и парсером SAX, и теперь я пытаюсь выяснить, как это работает, я знаком с JSON, но, похоже, он не работает как JSON.Итак, вот код, с которым я работаю

package com.myalbion.gamedataextractor.handlers;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.myalbion.gamedataextractor.Main;
import com.myalbion.gamedataextractor.datatables.Language;
import com.myalbion.gamedataextractor.datatables.Localized;
import com.myalbion.gamedataextractor.datatables.XMLFile;

public class LocalizationXMLFileHandler extends DefaultHandler {

    private String temp;
    Localized localized;
    List<Localized> localizedList;
    Map<Language, String> tempMap;

    /*
     * When the parser encounters plain text (not XML elements),
     * it calls(this method, which accumulates them in a string buffer
     */
    public void characters(char[] buffer, int start, int length) {
           temp = new String(buffer, start, length);
    }


    /*
     * Every time the parser encounters the beginning of a new element,
     * it calls this method, which resets the string buffer
     */ 
    public void startElement(String uri, String localName,
                  String qName, Attributes attributes) throws SAXException {
           temp = "";
           if (qName.equalsIgnoreCase("tu")) {
               localized = new Localized();
               localized.setUniqueName(attributes.getValue("tuid"));

           } else if(qName.equalsIgnoreCase("tuv")) {
               tempMap.put(Language.getLanguageFromCode(attributes.getValue("xml:lang")), )
           }
    }

    /*
     * When the parser encounters the end of an element, it calls this method
     */
    public void endElement(String uri, String localName, String qName)
                  throws SAXException {

           if (qName.equalsIgnoreCase("tu")) {
                  // add it to the list
                  accList.add(acct);

           } else if (qName.equalsIgnoreCase("Name")) {
                  acct.setName(temp);
           } else if (qName.equalsIgnoreCase("Id")) {
                  acct.setId(Integer.parseInt(temp));
           } else if (qName.equalsIgnoreCase("Amt")) {
                  acct.setAmt(Integer.parseInt(temp));
           }

    } 

}

, и я пытаюсь извлечь данные из этого XML-файла в tempMap, который содержит перечисление Language и локализованное имя.

<?xml version="1.0"?>
<tmx version="1.4">
  <body>
    <tu tuid="@ACCESS_RIGHTS_ACCESS_MODE">
      <tuv xml:lang="EN-US">
        <seg>Access Mode</seg>
      </tuv>
      <tuv xml:lang="DE-DE">
        <seg>Zugriffsmodus</seg>
      </tuv>
      <tuv xml:lang="FR-FR">
        <seg>Mode d'accès</seg>
      </tuv>
      <tuv xml:lang="RU-RU">
        <seg>Доступ</seg>
      </tuv>
      <tuv xml:lang="PL-PL">
        <seg>Tryb dostępu</seg>
      </tuv>
      <tuv xml:lang="ES-ES">
        <seg>Modo de acceso</seg>
      </tuv>
      <tuv xml:lang="PT-BR">
        <seg>Modo de acesso</seg>
      </tuv>
      <tuv xml:lang="ZH-CN">
        <seg>权限模式</seg>
      </tuv>
      <tuv xml:lang="KO-KR">
        <seg>접근 모드</seg>
      </tuv>
    </tu>
  </body>
</tmx>

Теперь в строке 49 кода Java я получаю код языка из атрибута tuv, но мне не хватает локализованного имени, которое находится ниже tuv, называемого seg of, может получить атрибут parent и получить значение seg в той же строке

1 Ответ

0 голосов
/ 22 сентября 2019

Вы перезаписываете свой текстовый буфер каждый раз, когда нажимаете на новый текстовый узел, включая текстовый узел только для пробелов, такой как между </seg> и </tuv>.Вам необходимо сохранить содержимое текстового буфера при обработке конечного тега seg и выбрать его при обработке конечного тега tuv.

Также вы должны знать, что содержимое одного текстаузел может быть предоставлен в виде последовательности вызовов text (): парсер может разбить его любым удобным способом (многие парсеры делают это на границах сущностей).Вам необходимо накапливать содержимое, добавляя в буфер.

Также обратите внимание, что XML чувствителен к регистру;Вы не должны игнорировать регистр при тестировании имен элементов.

И когда задаете вопросы о SO, это помогает правильно понять терминологию: обращение к элементам как к атрибутам может сбить людей с толку.

...