Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LoadXMLDocument и Unicode, Поле в XML Документе в Unicode 
:(
    Опции темы
ProfessorBraz
  Дата 1.10.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.7.2007

Репутация: нет
Всего: нет



Помогите пожалуйста разобраться с проблеммой, которая встречается при использовании функции 
LoadXMLDocument. Есть файл:

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!--<!DOCTYPE RESULTS SYSTEM "awnres.dtd">-->
<RESULTS>
    <RESULTSHEADER>       
        <VEHICLE>
            <IDENT>
                <REGISTRATION>BHKO             </REGISTRATION>
                <MANUFACTURER>NHJOP                </MANUFACTURER>
                <TYPE>RJIOPš             </TYPE>
                <VIN>MKLŽ               </VIN>
                <ENGINECODE> </ENGINECODE>
            </IDENT>           
        </VEHICLE>
    </RESULTSHEADER>
</RESULTS>

При чтении его функцией LoadXMLDocument вылезает Exeption. Причем если его пробывать читать IE поисходит тоже самое.
Есть ли возможность таки его загрузить, конечно как XMLDocument?

Заранее спасибо.

Это сообщение отредактировал(а) ProfessorBraz - 1.10.2009, 13:09
PM MAIL   Вверх
SenkraD
Дата 1.10.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



ProfessorBraz,  конечно есть - LoadXMLDocument.
А вы не читали что пишет ексепшин? Вы не задумывались почему IE
тоже кидает ексепшин? Вот что выдает firefox
Код
Ошибка синтаксического анализа XML: несоответствующий тег. Ожидается: </VEHICLE>.
Адрес: file:///H:/Downloads/text.xml
Строка 13, символ 15:


вообщем, у вас лишний тег имеется - </DATA>

Это сообщение отредактировал(а) SenkraD - 1.10.2009, 12:45


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ProfessorBraz
Дата 1.10.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.7.2007

Репутация: нет
Всего: нет



Цитата(SenkraD @ 1.10.2009,  12:41)
ProfessorBraz,  конечно есть - LoadXMLDocument.
А вы не читали что пишет ексепшин? Вы не задумывались почему IE
тоже кидает ексепшин? Вот что выдает firefox
Код
Ошибка синтаксического анализа XML: несоответствующий тег. Ожидается: </VEHICLE>.
Адрес: file:///H:/Downloads/text.xml
Строка 13, символ 15:


вообщем, у вас лишний тег имеется - </DATA>

IE тоже кидает ексепшин вот этот
An invalid character was found in text content. Error processing resource 'file:///I:/CB7/Testlane/Run/Emission/20081218_15...

                <TYPE>RJIOP


PM MAIL   Вверх
SenkraD
Дата 1.10.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



ProfessorBraz, я не могу понять в чём задача. Метод всё грузит
правильно, но XML-документ не валиден, о чём вам он и браузер сообщают.
Вам нужен настоящий XML или это ваше подобие XML для внутрених нужд.
Если второе то операции со строками вам в руки. Вот нашёл в очень старом
проекте
Код
//хедер
//---------------------------------------------------------------------------

#ifndef PosterDataParserH
#define PosterDataParserH

class TDataParser {
private:
        char *buffer;
public:
        int getStartTagOffset(char *name);
        int getStopTagOffset(char *name);
        int CreateNode(char *owner, char *name);
        int CreateNode(char *owner, char *name, char *value);
        int CreateNode(char *owner, char *name, int value);
        int getValue(char *name, char *value, int size);
        char *getBuffer();
        TDataParser();
        TDataParser(char *data);
        ~TDataParser();
};


//---------------------------------------------------------------------------
#endif

//  реализация
//---------------------------------------------------------------------------


#pragma hdrstop
#include <string.h>
#include <stdio.h>

#include "PosterDataParser.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

//---------------------------------------------------------------------------
TDataParser::TDataParser() {
        char *Header = "<Data></Data>";
        buffer = new char[strlen(Header) + 1];
        strcpy(buffer, Header);
}

//---------------------------------------------------------------------------
TDataParser::TDataParser(char *data) {
        buffer = new char[strlen(data) + 1];
        strcpy(buffer, data);
}


//---------------------------------------------------------------------------
int TDataParser::getStartTagOffset(char *name) {
        char *str = new char [strlen(name) + 10];
        strcpy(str, "<");
        strcat(str, name);
        strcat(str, ">");
        int str_len = strlen (str);
        char * substr = strstr(buffer, str);
        delete str;
        if(!substr) return -1;
        return (strlen(buffer) - strlen(substr) + str_len);
}

//---------------------------------------------------------------------------
int TDataParser::getStopTagOffset(char *name) {
        char *str = new char [strlen(name) + 10];
        strcpy(str, "</");
        strcat(str, name);
        strcat(str, ">");
         char * substr = strstr(buffer, str);
        delete str;
        if(!substr) return -1;
        return (strlen(buffer) - strlen(substr));
}

//---------------------------------------------------------------------------
int TDataParser::CreateNode(char *owner, char *name) {
        int start = getStartTagOffset(owner);
        int stop = getStopTagOffset(owner);

        if((start < 0) || (stop < 0)) return -1;
        int BufferSize = strlen(buffer) + strlen(name) * 2 + 0xFF;
        char * new_buffer = new char[BufferSize];
        memset(new_buffer, 0x00, BufferSize);
        strncpy(new_buffer, buffer, start);
        strcat(new_buffer, "<");
        strcat(new_buffer, name);
        strcat(new_buffer, ">");
        strcat(new_buffer, "</");
        strcat(new_buffer, name);
        strcat(new_buffer, ">");
        strcat(new_buffer, buffer + start);
        delete [] buffer;
        buffer = new_buffer;
        return 1;
}

//---------------------------------------------------------------------------
int TDataParser::CreateNode(char *owner, char *name, char * value) {
        int start = getStartTagOffset(owner);
        int stop = getStopTagOffset(owner);

        if((start < 0) || (stop < 0)) return -1;
        int BufferSize = strlen(buffer) + strlen(name) * 2 + strlen(value) + 0xFF;
        char * new_buffer = new char[BufferSize];
        memset(new_buffer, 0x00, BufferSize);
        strncpy(new_buffer, buffer, start);
        strcat(new_buffer, "<");
        strcat(new_buffer, name);
        strcat(new_buffer, ">");
        strcat(new_buffer, value);
        strcat(new_buffer, "</");
        strcat(new_buffer, name);
        strcat(new_buffer, ">");
        strcat(new_buffer, buffer + start);
        delete [] buffer;
        buffer = new_buffer;
        return 1;
}

//---------------------------------------------------------------------------
int TDataParser::CreateNode(char *owner, char *name, int value) {
        int start = getStartTagOffset(owner);
        int stop = getStopTagOffset(owner);

        if((start < 0) || (stop < 0)) return -1;
        char str[0xFF];
        sprintf(str, "%d", value);
        int BufferSize = strlen(buffer) + strlen(name) * 2 + strlen(str) + 0xFF;
        char * new_buffer = new char[BufferSize];
        memset(new_buffer, 0x00, BufferSize);
        strncpy(new_buffer, buffer, start);
        strcat(new_buffer, "<");
        strcat(new_buffer, name);
        strcat(new_buffer, ">");
        strcat(new_buffer, str);
        strcat(new_buffer, "</");
        strcat(new_buffer, name);
        strcat(new_buffer, ">");
        strcat(new_buffer, buffer + start);
        delete [] buffer;
        buffer = new_buffer;
        return 1;
}


//---------------------------------------------------------------------------
int TDataParser::getValue(char *name, char *value, int size) {
        int start = getStartTagOffset(name);
        int stop = getStopTagOffset(name);

        if((start < 0) || (stop < 0)) return -1;
        if(size < (stop - start) + 1) return -1;
        memset(value, 0x00, (stop - start) + 1);
        strncpy(value, buffer + start, stop - start);
        return 1;
}

//---------------------------------------------------------------------------
char *TDataParser::getBuffer() {
        return buffer;
}

//---------------------------------------------------------------------------
TDataParser::~TDataParser() {
        delete buffer;
}
А если первое, то читайте стандарт XML и правьте ошибки в XML-данных

Это сообщение отредактировал(а) SenkraD - 1.10.2009, 13:17


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ProfessorBraz
Дата 1.10.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.7.2007

Репутация: нет
Всего: нет



Так в том то и дело что в <TYPE>RJIOPš </TYPE>
и <VIN>MKLŽ </VIN> ноходятся символы 0x9a и 0x8e, которые и приводят к краху. Ручками то я их убрать могу, то приборчик который генерит этот хмл настроен на региональный язык и это региональные буковки, которые могут встречаться. Наскольно я понимаю, они тоже Юникод. Ток в чем же собака?

Если фай сохранить конвертированным в utf-8, то все читается. Но если приборчик кинет такой файл, как мне коректно его обработать, чтобы не наткнуться на ексепшен. Можно его как-нибудь принудительно конвертнуть?

Это сообщение отредактировал(а) ProfessorBraz - 1.10.2009, 14:17
PM MAIL   Вверх
xvr
Дата 2.10.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(ProfessorBraz @ 1.10.2009,  13:29)
Так в том то и дело что в <TYPE>RJIOPš </TYPE>
и <VIN>MKLŽ </VIN> ноходятся символы 0x9a и 0x8e, которые и приводят к краху. 


У вас в заголовке xml прописано, что он представлен в UTF-8. Ни 0x9a ни 0x8e не являются валидными UTF-8 символами

Цитата

Если фай сохранить конвертированным в utf-8, то все читается. 

 smile 
В бане -
- Самуил Абрамовичь, вы либо крестик снимите, либо штаны оденьте.

Цитата

Но если приборчик кинет такой файл, как мне коректно его обработать, чтобы не наткнуться на ексепшен.


Вы уж договоритесь с приборчиком, UTF у него или не UTF  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.