Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение строки из XML 
V
    Опции темы
aktuba
Дата 17.8.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Вот пример XML:
Код

<?xml version="1.0" encoding="Windows-1251"?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value><int>-32601</int></value>
        </member>
        <member>
          <name>faultString</name>
          <value><string>Ошибка на сервере. Запрошенный метод <em>blogger.getUserInfo1</em> не определен.</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>


Вот код:
Код

const
  C_TypeString = 'string';
  C_Name = 'name';
  C_Value = 'value';
  C_Struct = 'struct';
  C_Int = 'int';
  C_I4 = 'i4';

var
  lXML: IXMLDocument;
  lNode, lMember, lName, lValue, lType: IXMLNode;
  lUser: TUserData;
  lCode: Integer;
  lErrCode: Integer;
  lErrText: WideString;
  Idx, Idx2: Integer;
  lNameValue, lTypeName: string;
begin
  lXML := NewXMLDocument;
  lXML.XML.Text := AXML;
  lXML.Active := True;
  lXML.Encoding := 'Windows-1251';
  try
    lNode := lXML.DocumentElement.ChildNodes.First;
    lCode := 0;
    if lNode.NodeName = 'fault' then lCode := 1; // Ошибка запроса
    if lNode.NodeName = 'params' then lCode := 2; // Запрос выполнен успешно
    case lCode of
      1: // Ошибка запроса
        begin
          lErrCode := -1;
          lErrText := C_NotDefinedError;
          while Assigned(lNode) and (lNode.NodeName <> C_Struct) do
            lNode := lNode.ChildNodes.First;
          if Assigned(lNode) then
            begin
              for Idx := 0 to lNode.ChildNodes.Count - 1 do
                begin
                  lMember := lNode.ChildNodes[Idx];
                  lName := lMember.ChildNodes.FindNode(C_Name);
                  lNameValue := '';
                  if Assigned(lName) then
                    lNameValue := AnsiLowerCase(string(lName.NodeValue));
                  lValue := lMember.ChildNodes.FindNode(C_Value);
                  lType := lValue.ChildNodes.First;
                  lTypeName := '';
                  if Assigned(lType) then
                    lTypeName := AnsiLowerCase(lType.NodeName);
                  if lNameValue = 'faultcode' then
                    if (lTypeName = C_Int) or (lTypeName = C_I4) then
                      lErrCode := StrToIntDef(string(lType.NodeValue), -1);
                  if lNameValue = 'faultstring' then
                    if lTypeName = C_TypeString then
                      lErrText := lType.NodeValue;
                end;  
            end;
        end;
      2: // Запрос выполнен успешно
        begin
        ...
        end;
    end;
  finally
    lXML.Active := False;
  end;
end;


Никак не могу получить строку
Код

Ошибка на сервере. Запрошенный метод <em>blogger.getUserInfo1</em> не определен.


Направьте на путь истинный...  smile  smile 


--------------------
user posted image
PM MAIL WWW Skype   Вверх
aktuba
Дата 17.8.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Попробовал сделать следующее: убрал теги между <string> и </string>. Теперь XML у меня выглядит так:
Код

<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value><int>-32601</int></value>
        </member>
        <member>
          <name>faultString</name>
          <value><string>Ошибка на сервере. Запрошенный метод blogger.getUserInfo1 не определен.</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>


Однако это не помогло  smile 


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 17.8.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



дай пример приложения и xml'ку в архиве) поковыряемса


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 17.8.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



не могу =(((( получаю из сети. но то, что я привет - это один в один. сюда скопи-пастил...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 17.8.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Вот пример передачи и принятия XML-документации на основе TjanXMLParser2.

Если у тебя документ XML валиден, то думаю тебе мой пример поможет!

Совет:
Проверить кодировку, одно дело она в заголовке, другое дело соответствует ли?

Это сообщение отредактировал(а) EvilsInterrupt - 17.8.2007, 16:09

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  XML_Network.7z.bak2 6,43 Kb
PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 17.8.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



EvilsInterrupt, конечно! Иначе галочка стояла-бы...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 17.8.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Да блин, пост подредактировал и все, чел не видит что я ему помощь кинул ))). Хотелось бы чтобы на форумах не только колнку даты добавления нового поста, но и время последнего апдейта была - иногда это очень нужно!
PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 17.8.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Цитата

Если у тебя документ XML валиден, то думаю тебе мой пример поможет!


XML валиден, проверял. Любой редактор, IE, FF открывают без проблем.

Цитата

Проверить кодировку, одно дело она в заголовке, другое дело соответствует ли?


Соответствует, т.к. перед тем как перевести строку в XML, преобразую ее в нужный вид.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
aktuba
Дата 17.8.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Так, проблема решена. Трабла была в следующем (взято из XMLDoc):
Код

procedure TXMLNode.CheckTextNode;
begin
  { Create the actual text node when none already exists }
  if not DOMNode.hasChildNodes then
  begin
    DOMNode.appendChild(DOMNode.ownerDocument.createTextNode(''));
    SetChildNodes(nil);
  end
  else if (DOMNode.childNodes.length > 1) or
    not (DOMNode.childNodes[0].nodeType in [TEXT_NODE, CDATA_SECTION_NODE]) then
    XMLDocError(SNotSingleTextNode, [DOMNode.nodeName]);
end;


т.е., проверяется узел на наличие чилдов и если наличие обнаружено, то XMLDoc считает, что данный нод не может содержать текстовое значение. Т.к. изначально в строке есть html-теги, то они воспринимаются за child-ы... Решение пока следующее - все < и > в ноде <string> заменяю на [ и ] соответственно. Вот код, может кто что предложит...
Код

const
  C_String = '<string>';
  C_UnString = '</string>';
var
  lPos: Integer;
  f: Boolean;
begin
  lPos := 1;
  f := False;
  FResponse := Utf8ToAnsi(FResponse);
  while lPos <= Length(FResponse) do
    begin
      if Copy(FResponse, lPos, Length(C_String)) = C_String then
        begin
          f := True;
          Inc(lPos, Length(C_String));
          Continue;
        end;
      if Copy(FResponse, lPos, Length(C_UnString)) = C_UnString then
        begin
          f := False;
          Inc(lPos, Length(C_UnString));
          Continue;
        end;
      if (FResponse[lPos] = '<') and f then
        FResponse[lPos] := '[';
      if (FResponse[lPos] = '>') and f then
        FResponse[lPos] := ']';
      Inc(lPos);
    end;
  FProc(AnsiToUtf8(FResponse));
end;



--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 17.8.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



aktuba, 
Еще, есть у тебя в XML такие строки:
Код

        <member>
          <name>faultCode</name>
          <value><int>-32601</int></value>
        </member>

не рекомендую!!!

Лучше:
Код

        <member>
          <name>faultCode</name>
          [U]<value type="int">-32601</value>[/U]
        </member>



Это сообщение отредактировал(а) EvilsInterrupt - 17.8.2007, 17:49
PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 17.8.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Цитата

Еще, есть у тебя в XML такие строки
...
не рекомендую!!!


Да я даже не могу ничего поменять - это xml-rpc. Это стандарт и ничего с этим не сделаешь =(...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 17.8.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



aktuba, Уж не OPC-XMLDA ковыряешь? ))
PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 17.8.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Цитата

aktuba, Уж не OPC-XMLDA ковыряешь? )) 


Нет, blogger


--------------------
user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

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

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


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

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




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


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

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