Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1286379344
@!!ex
2010-10-06 19:35
2011.01.02
ЛОгирование исключений


2-1286622237
v_a_belousov
2010-10-09 15:03
2011.01.02
RichEdit загрузка документов с объектами


2-1286535934
noob_one
2010-10-08 15:05
2011.01.02
Как из переменной перечисляемого типа получить строку


15-1284669964
картман
2010-09-17 00:46
2011.01.02
нечеткий поиск в БД


2-1282054512
Black123
2010-08-17 18:15
2011.01.02
TWebBrowser и WEB2.0