Builder & XML FormatXMLData
От: Yury Украина all-ftp.narod.ru
Дата: 05.07.05 11:59
Оценка:
Пытаюсь отформатировать ХМЛ-документ. После форматирования все не англоязычные символы переводятся в крокозяблики
ХМЛ сохранялся в блокноте.

Наверняка тут в кодировке проблеммы. Только незнаю как исправить.


Шапка ХМЛ документа:
<?xml version="1.0" encoding="UTF-8"?>

А вот код на Билдере:

DOMString dsOut;
dsOut = FormatXMLData(XMLD_IN->XML->Text);

   _di_IXMLDocument XMLD_Tmp;
   XMLD_Tmp = LoadXMLData(dsOut);
   XMLD_Tmp->SetEncoding("UTF-8");
   XMLD_Tmp->SaveToFile(WideString("Data\\tmp.xml"));


Помогите плиз!
--------------------
Yury Red (aka Red)
Re: Builder & XML FormatXMLData
От: Аноним  
Дата: 06.07.05 09:50
Оценка:
Здравствуйте, Yury, Вы писали:

Y>Пытаюсь отформатировать ХМЛ-документ. После форматирования все не англоязычные символы переводятся в крокозяблики

Y>ХМЛ сохранялся в блокноте.

Y>Наверняка тут в кодировке проблеммы. Только незнаю как исправить.



Y>Шапка ХМЛ документа:

Y><?xml version="1.0" encoding="UTF-8"?>

Y>А вот код на Билдере:


Y>
Y>DOMString dsOut;
Y>dsOut = FormatXMLData(XMLD_IN->XML->Text);

Y>   _di_IXMLDocument XMLD_Tmp;
Y>   XMLD_Tmp = LoadXMLData(dsOut);
Y>   XMLD_Tmp->SetEncoding("UTF-8");
Y>   XMLD_Tmp->SaveToFile(WideString("Data\\tmp.xml"));
Y>


Y>Помогите плиз!

Попробуй кодировку Windows-1251
Re: Builder & XML FormatXMLData
От: Danchik Украина  
Дата: 07.07.05 15:12
Оценка:
Здравствуйте, Yury, Вы писали:

Y>Пытаюсь отформатировать ХМЛ-документ. После форматирования все не англоязычные символы переводятся в крокозяблики

Y>ХМЛ сохранялся в блокноте.

Y>Наверняка тут в кодировке проблеммы. Только незнаю как исправить.


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

Вот код процедуры, правда на object pascal, но я надеюсь тебе не составит труда ее спортировать.
CurIdent поставь в '', a IdentStr равным #9 (Tab)

function FormatNode(Node: IXMLDOMNode; CurIndent, IndentStr: string): IXMLDOMNode;
var
  aChild : IXMLDOMNode;
  aDocumentNode : IXMLDOMDocument;
begin
  Result := Node;

  if Supports (Node, IXMLDOMDocument, aDocumentNode) then
    Node := aDocumentNode.documentElement;

  if Node = nil then
    Exit;

  if Node = nil then
    Exit;

  if IndentStr = '' then
    IndentStr := '  ';

  if (Node.firstChild <> nil) and (Node.firstChild.nodeType = 1) then begin
    Node.insertBefore (GetOwnerDocument (Node).createTextNode(#13#10 + CurIndent + IndentStr), Node.firstChild);
    aChild := Node.firstChild.nextSibling; // we just inserted so goto second child
  end else
    aChild := Node.firstChild;

  while aChild <> nil do begin
    FormatNode (aChild, CurIndent + IndentStr, IndentStr);
    if (aChild.nodeType = 1) and (aChild.nextSibling <> nil) and (aChild.nextSibling.nodeType = 1) then
      aChild := Node.insertBefore(GetOwnerDocument (Node).createTextNode(#13#10 + CurIndent + IndentStr), aChild.nextSibling);
    aChild := aChild.nextSibling;
  end;

  if (Node.lastChild <> nil) and (Node.lastChild.nodeType = 1) then begin
    aChild := GetOwnerDocument (Node).createTextNode(#13#10 + CurIndent);
    Node.appendChild (aChild);
  end;

  Result := Node;
end;


Надеюсь это тебе поможет, удачи!
Re[2]: Builder & XML FormatXMLData
От: Danchik Украина  
Дата: 07.07.05 15:15
Оценка:
Здравствуйте, Danchik, Вы писали:

Сорри пропустил дополнительную процедуру:

function GetOwnerDocument(Node: IXMLDOMNode): IXMLDOMDocument;
begin
  Result := Node.ownerDocument;
  if Result = nil then
    Supports (Node, IXMLDOMDocument, Result);
end;
Re[2]: Builder & XML FormatXMLData
От: Аноним  
Дата: 11.07.05 09:38
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, Yury, Вы писали:


Y>>Пытаюсь отформатировать ХМЛ-документ. После форматирования все не англоязычные символы переводятся в крокозяблики

Y>>ХМЛ сохранялся в блокноте.

Y>>Наверняка тут в кодировке проблеммы. Только незнаю как исправить.


D>Это точно что в кодировке...

D>Предлагаю не ганять в строки XML document а поправить именно XML ноды. Привожу процедурку которая этим занимается.
D>Передаеш IXMLDOMNode, а она возвращает тот же Node но отформатированный...

D>Вот код процедуры, правда на object pascal, но я надеюсь тебе не составит труда ее спортировать.

D>CurIdent поставь в '', a IdentStr равным #9 (Tab)
D>Надеюсь это тебе поможет, удачи!

Тоже надеюсь, что поможет.
Только вот, что-то это всё сложновато. Получается что FormatXMLData "левая" функия и с русскоязычными документами не работает?

А что за функция такая в листинге Supports ?
Re[3]: Builder & XML FormatXMLData
От: Danchik Украина  
Дата: 11.07.05 12:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Danchik, Вы писали:


D>>Здравствуйте, Yury, Вы писали:


Y>>>Пытаюсь отформатировать ХМЛ-документ. После форматирования все не англоязычные символы переводятся в крокозяблики

Y>>>ХМЛ сохранялся в блокноте.

Y>>>Наверняка тут в кодировке проблеммы. Только незнаю как исправить.


D>>Это точно что в кодировке...

D>>Предлагаю не ганять в строки XML document а поправить именно XML ноды. Привожу процедурку которая этим занимается.
D>>Передаеш IXMLDOMNode, а она возвращает тот же Node но отформатированный...

D>>Вот код процедуры, правда на object pascal, но я надеюсь тебе не составит труда ее спортировать.

D>>CurIdent поставь в '', a IdentStr равным #9 (Tab)
D>>Надеюсь это тебе поможет, удачи!

А>Тоже надеюсь, что поможет.

А>Только вот, что-то это всё сложновато. Получается что FormatXMLData "левая" функия и с русскоязычными документами не работает?
Скорее все го потеря происходит при копировании данных из одного документа в другой, это только предположение, дальше нужно дебажить...

А>А что за функция такая в листинге Supports ?


Supports это стандартная функция из SysUtils.pas. На object pascal она выглядит так:

function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean;
begin
  Result := (Instance <> nil) and (Instance.QueryInterface(IID, Intf) = 0);
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.