2016-09-24 2 views
1

Проблема -> На самом деле я столкнулся с проблемой анализа XML (SAX Parser) в Unix Machine. Same Jar/Java-Code ведет себя по-разному на Windows и Unix Machine, почему? :(XML Parser ведет себя по-разному на машине Unix только для огромного/большого xml-файла. Тот же код отлично работает в окнах. ЗАЧЕМ?

машина

Windows -> отлично работает, используя SAX Parser загрузить огромный файл XML, Почитаю все значения правильно и заполнить одинаковые значения Charset.defaultCharset() окна-1252

Unix машина -.> После затем создал JAR и развернул в Unix -> tomcat и выполнил банку. Пытался загрузить тот же огромный XML-файл. Но заметил, что некоторые значения или символы заполнены пустым или неполным, например Название страны, заполненное как «ysia», а не «Malaysia», или транзакция Дата заселения как «3 PM» вместо «18/09/2016 03:31:23 PM». Charset.defaultCharset() UTF-8

Проблема только с Unix, потому что когда я загружаю один и тот же xml в windows или в локальное eclipse, он отлично работает, и все значения заполняются правильно.

Также я попытался изменить свой код и установить кодировку как UTF-8 для inputSteamReader, но все же он неверно читается в unix-блоке.

Примечание: в xml нет специальных символов. Также заметили одно: когда я беру те же записи (эти значения не заполнены правильно) в другом файле xml и загружаются в unix-машине с тем же банком, он отлично работает. Это означает, что возникают проблемы при загрузке этих записей с огромными данными. :(

Код установки:

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
try { 
    SAXParser saxParser = saxParserFactory.newSAXParser(); 
    InputStream inputStream= new FileInputStream(inputFilePath); 
    Reader reader = new InputStreamReader(inputStream,"UTF-8"); 
    InputSource is = new InputSource(reader); 
    is.setEncoding("UTF-8"); 
    saxParser.parse(is,(DefaultHandler) handler); 
} catch(Exception ex){ 
    ex.printStackTrace(); 
} 

Обработчики:

public void characters(char[] ac, int i, int j) throws SAXException { 
    chars.append(ac, i, j); 
    tmpValue = new String(ac, i, j).trim(); 
} 


public void endElement(String s, String s1, String element) throws SAXException { 
    if (element.equalsIgnoreCase("transactionDate")) {   
    obj.setTransactionDate(tmpValue); 
    } 
} 

Пожалуйста, предложить, что должно быть решение

+0

Можете ли вы показать код, который читает XML? Случайное предположение ожидало бы {InputStream | Reader} .read(), чтобы прочитать заданное количество символов - вместо проверки возвращаемого значения ... –

+0

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); \t \t try { \t \t SAXParser saxParser = saxParserFactory.newSAXParser(); \t \t InputStream inputStream = new FileInputStream (inputFilePath); \t \t Считыватель чтения = новый InputStreamReader (inputStream, «UTF-8»); \t \t InputSource is = new InputSource (reader); \t \t is.setEncoding ("UTF-8"); \t \t saxParser.parse (есть, (DefaultHandler) обработчик); \t \t} catch (Exception ex) {ex.printStackTrace();} –

+0

public void characters (char [] ac, int i, int j) throws SAXException { \t символы.append (ac, i, j); tmpValue = new String (ac, i, j) .trim(); } –

ответ

0

Если текущий буфер чтения заканчивается в середине элемента? , вы можете получить два (или более) обращения к characters() для одного и того же элемента - например, один с «Малой» и один с «ysia» - вместо одного вызова с «Малайзией». В этом случае , ваш код перезаписывает tmpValue, содержащий «Mala» с «ysia». Чтобы решить эту проблему, вам необходимо скопировать содержимое нескольких вызовов на characters():

public void startElement(String uri, String localName, String qName, 
    Attributes attributes) throws SAXException { 
    if(qName.equalsIgnoreCase("customerName")){ 
    chars.setLength(0); 
    } 
    tmpValue = null; 
} 

public void characters(char[] ac, int i, int j) throws SAXException { 
    chars.append(ac, i, j); 
    if (tmpValue == null) { 
    tmpValue = new String(ac, i, j); 
    } else { 
    tmpValue += new String(ac, i, j); 
    } 
} 

public void endElement(String s, String s1, String element) throws SAXException { 
    if (element.equalsIgnoreCase("transactionDate") && tmpValue != null) {   
    obj.setTransactionDate(tmpValue.trim()); 
    } 
} 
+0

После обновления кода в соответствии с вашим предложением он объединяет все поля xml, как показано ниже :("[email protected] singh VictorT8217198ANRITSingaporean18/09/2016 09: 19: 50Combl1-11020228899218/09/2016 09:00:00 AM " –

+0

Вы устанавливаете tmp в null startElement(), как предложено выше? –

+0

Обновление: перемещено предложение из текста в startElement() (добавлено) –