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

ХМЛ сохранялся в блокноте.
Наверняка тут в кодировке проблеммы. Только незнаю как исправить.
Шапка ХМЛ документа:
<?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, Вы писали:
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
Здравствуйте, 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;
Надеюсь это тебе поможет, удачи!
Здравствуйте, Danchik, Вы писали:
Сорри пропустил дополнительную процедуру:
function GetOwnerDocument(Node: IXMLDOMNode): IXMLDOMDocument;
begin
Result := Node.ownerDocument;
if Result = nil then
Supports (Node, IXMLDOMDocument, Result);
end;
Здравствуйте, 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 ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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;