Текущий архив: 2011.01.02;
Скачать: CL | DM;
Вниз
IXMLDomDocument, как получить полный текст XML? Найти похожие ветки
← →
bss (2010-09-21 14:03) [0]Есть некий IXMLDomDocument, в который был загружен XML-файл, модифицирован и теперь его нужно записать в БД. Возник вопрос - а как получить XML в текстовом виде?! Поскольку IXMLDomDocument отнаследован от IXMLDOMNode, то существует свойство "xml", но оно не полностью эквивалентно тексту XML-файла, в частности там отсутствует описание кодировки. То есть:
1) если сохранять файл посредством IXMLDomDocument.save, то начало файла выглядит так:
<?xml version="1.0" encoding="windows-1251"?>
2) если посмотреть свойство IXMLDomDocument.xml, то там начало в виде:
<?xml version="1.0"?>
Вопрос в том, чтобы получить текст, аналогичный тому, который запишет движок MS XML в файл.
Конечно, можно писать в файл, потом считать, но как-то это не кошерно...
← →
Ega23 © (2010-09-21 14:30) [1]
> в частности там отсутствует описание кодировки.
Специально только что проверил. Пишет с кодировкой.
← →
bss (2010-09-21 15:12) [2]
> Специально только что проверил. Пишет с кодировкой.
кто именно и куда пишет? Именно в свойстве xml содержится текст, где есть указание кодировки?
Покажи код, если не сложно.
← →
Медвежонок Пятачок © (2010-09-21 17:47) [3]то существует свойство "xml", но оно не полностью эквивалентно тексту XML-файла, в частности там отсутствует описание кодировки. То есть:
Оно там есть после сохранения на диск (если было указано).
А в твоем случае надо просто брать свойство xml и фиксить его, проверяя наличие кодировки в прологе перед заливкой в БД.
← →
bss (2010-09-21 18:35) [4]я про то и пишу, что оно есть, если писать файл на диск.
А вот в свойстве XML его нету. Есть подозрение, что и еще чего-то может игнорироваться. Писать на диск файл, а потом его тупо считывать как-то не айс.
Задача - получить текст в таком виде, в котором он бы записался на диск! Наверняка же есть способ.
> и фиксить его
еще и вручную заняться немного парсингом над текстом XML? Ну тоже подход так себе, на мой взгляд...
← →
Медвежонок Пятачок © (2010-09-21 19:12) [5]это не парсинг, это проверка того, что строка начинается с определенной подстроки.
А вот в свойстве XML его нету.
потому что оно там бессмысленно до тех пор, пока документ не будет сериализован.
ну сам посуди:
создал я документ в памяти с нуля.
указал, что кодировка будет utf-8
затем наполнил его в коде данными, используя строковые литералы с русскими словами.
при чтении атрибутов и узлов этого документа мне будет возвращаться то, что я туда записал независимо от кодировки в прологе.
написал я в атрибут "мама" - мне чтение оттуда вернет "мама".
какая бы кодировка не была указана мной в прологе.
ну и смысел тогда какой ее там держать (в свойстве xml), если я на диск ничего не записываю?
← →
sniknik © (2010-09-21 20:36) [6]> А вот в свойстве XML его нету.
оно, "у нутрях", в юникоде.
> Есть подозрение, что и еще чего-то может игнорироваться.
ну и что, если оно не нужно то нехай игнорируется. тебе то что?
← →
Медвежонок Пятачок © (2010-09-21 21:06) [7]ShowMessage("<?xml version="1.0" encoding="windows-1251"?>" + xdoc.documentElement.xml);
← →
Slym © (2010-09-22 13:00) [8]Save() принимает не только строку но и IStream
TStreamAdapter + MemoryStream в рукиfunction NewXmlDocument(const DocumentElementName:string):variant;
const XMLObjName="Msxml2.DOMDocument";
begin
result:=CreateOleObject(XMLObjName) as IDispatch;
result.appendChild(result.createProcessingInstruction("xml"," version="1.0" encoding="windows-1251""));
result.documentElement:=result.createElement(DocumentElementName);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
doc:variant;
s:TStringStream;
begin
doc:=NewXmlDocument("doc");
s:=TStringStream.Create("");
doc.save(TStreamAdapter.Create(s) as IStream);
Memo1.Lines.Text:=s.DataString;
s.Free;
end;
← →
bss (2010-09-22 14:44) [9]Slym, супер, спасибо!
← →
Slym © (2010-09-22 15:04) [10]sniknik © (21.09.10 20:36) [6]
ну и что, если оно не нужно то нехай игнорируется. тебе то что?
а то... день убил на поиск неявной фичи - обрезание (trim) начального пробела в значении ноды<node> -тут пробел</node>
получалось фигня " -тут пробел"=="-тут пробел" и все ломалось
лечится тупо:node.value:=str;
if node.value<>str then
begin
Node.setAttribute("space","preserve");
node.value:=str;
end;
if node.value<>str then
raise exception.create("What the fucking shit!");
Страницы: 1 вся ветка
Текущий архив: 2011.01.02;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.008 c