Как записать/прочитать XML файл в тэг другого XML файла?
От: surovi  
Дата: 08.08.06 15:32
Оценка:
записываемый/читаемый файл — источник
файл куда записывают/откуда читают — приемник

На данный момент у меня есть два варианта решения:
1. загрузить файл источник в XMLDocument и уже добавлять его пробегаясь по всем XMLNode в файл приемник, предварительно созданный тоже как XMLDocument
2. формировать файл приемник, используя не XMLDocument, а как простой текстовый файл и записывать файл источник тоже как простой текстовый файл

Но эти варианты не совсем меня устраивают:
1. недостаточно быстрый при больших размерах файлов источников
2. нет универсальности в формировании xml, хотелось бы использовать стандартные интерфейсы для работы с xml
Re: Как записать/прочитать XML файл в тэг другого XML файла?
От: Lloyd Россия  
Дата: 08.08.06 15:50
Оценка:
Здравствуйте, surovi, Вы писали:

S>Но эти варианты не совсем меня устраивают:

S>1. недостаточно быстрый при больших размерах файлов источников

Просто не надо использовать xml для больших объемов и будет быстро.
Re[2]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 08.08.06 16:35
Оценка:
to Lloyd
Да я бы вообще и XML не использовал и вообще ничего не делал бы, а валялся бы на пляже с девочками и т.п.
Однако форум не об этом. Нет ответа по существу — не засоряй топик.
Re[3]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 08.08.06 16:38
Оценка:
to Lloyd
Понимаешь, смысл в том, что вложенные xml это Recordset-ы, а они уже могут быть и маленькими и большими.
И от этого никуда не денешься.
Re[4]: Как записать/прочитать XML файл в тэг другого XML фай
От: Lloyd Россия  
Дата: 08.08.06 19:16
Оценка:
Здравствуйте, surovi, Вы писали:

S>to Lloyd

S>Понимаешь, смысл в том, что вложенные xml это Recordset-ы, а они уже могут быть и маленькими и большими.
S>И от этого никуда не денешься.

Тогда смирись с той производительностью, которую предлагает dom. Или читай/пиши ручками через XmlReader/XmlWriter.
Re[3]: Как записать/прочитать XML файл в тэг другого XML фай
От: Lloyd Россия  
Дата: 08.08.06 19:17
Оценка:
Здравствуйте, surovi, Вы писали:

S>to Lloyd

S>Да я бы вообще и XML не использовал и вообще ничего не делал бы, а валялся бы на пляже с девочками и т.п.
S>Однако форум не об этом. Нет ответа по существу — не засоряй топик.

Хорошо, я приму твой комментарий про девочек в качестве образца ответа по существу.
Re[4]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 09.08.06 04:47
Оценка:
to Lloyd
Извини, не хотел обидеть.
Re[5]: Как записать/прочитать XML файл в тэг другого XML фай
От: Lloyd Россия  
Дата: 09.08.06 05:03
Оценка:
Здравствуйте, surovi, Вы писали:

S>to Lloyd

S>Извини, не хотел обидеть.

У тебя это получилось.
Re: Как записать/прочитать XML файл в тэг другого XML файла?
От: dkart Россия  
Дата: 09.08.06 05:22
Оценка:
Здравствуйте, surovi, Вы писали:

S>записываемый/читаемый файл — источник

S>файл куда записывают/откуда читают — приемник

S>На данный момент у меня есть два варианта решения:

S>1. загрузить файл источник в XMLDocument и уже добавлять его пробегаясь по всем XMLNode в файл приемник, предварительно созданный тоже как XMLDocument
S>2. формировать файл приемник, используя не XMLDocument, а как простой текстовый файл и записывать файл источник тоже как простой текстовый файл

S>Но эти варианты не совсем меня устраивают:

S>1. недостаточно быстрый при больших размерах файлов источников
S>2. нет универсальности в формировании xml, хотелось бы использовать стандартные интерфейсы для работы с xml

1. А зачем пробегаться? Добавить documentElement источника в XMLNode приемника. Производительность не тестировал
2. Можно воспользоваться секцией CDATA (запихать источник туда). Производительность также не тестировал.
Re: Как записать/прочитать XML файл в тэг другого XML файла?
От: V.Petrovski Беларусь  
Дата: 09.08.06 05:50
Оценка:
Здравствуйте, surovi, Вы писали:

[skipped]

Может стоит посмотреть XInclude и XPointer, их реализация под .NET есть в проекте Mvp.Xml.


RSDN@Home
Nemerle
.NET Localizer
Re: Как записать/прочитать XML файл в тэг другого XML файла?
От: WinterMute Россия http://yarrr.ru
Дата: 09.08.06 07:39
Оценка:
Здравствуйте, surovi, Вы писали:

S>записываемый/читаемый файл — источник

S>файл куда записывают/откуда читают — приемник

S>На данный момент у меня есть два варианта решения:

S>1. загрузить файл источник в XMLDocument и уже добавлять его пробегаясь по всем XMLNode в файл приемник, предварительно созданный тоже как XMLDocument
S>2. формировать файл приемник, используя не XMLDocument, а как простой текстовый файл и записывать файл источник тоже как простой текстовый файл

S>Но эти варианты не совсем меня устраивают:

S>1. недостаточно быстрый при больших размерах файлов источников
S>2. нет универсальности в формировании xml, хотелось бы использовать стандартные интерфейсы для работы с xml

А поставить ссылку на внешний раздел нельзя?

// source.xml <?xml version="1.0" encoding="utf-8"?> <some></some> // repicient.xml <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE some [ <!ENTITY ref PUBLIC "source.xml"> ]> <some> &ref; </some>

Re: Как записать/прочитать XML файл в тэг другого XML файла?
От: kan_izh Великобритания  
Дата: 09.08.06 09:17
Оценка:
surovi wrote:

> записываемый/читаемый файл — источник

> файл куда записывают/откуда читают — приемник

> На данный момент у меня есть два варианта решения:

> 1. загрузить файл источник в XMLDocument и уже добавлять его пробегаясь
> по всем XMLNode в файл приемник, предварительно созданный тоже как
> XMLDocument
> 2. формировать файл приемник, используя не XMLDocument, а как простой
> текстовый файл и записывать файл источник тоже как простой текстовый файл
>
> Но эти варианты не совсем меня устраивают:
> 1. недостаточно быстрый при больших размерах файлов источников
> 2. нет универсальности в формировании xml, хотелось бы использовать
> стандартные интерфейсы для работы с xml
SAX чем не устраивает?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 09.08.06 10:01
Оценка:
to dkart
dkart> 1. А зачем пробегаться? Добавить documentElement источника в XMLNode приемника. Производительность не тестировал
А можешь немного подробнее об этом, это вроде то, что я ищу.

dkart> 2. Можно воспользоваться секцией CDATA (запихать источник туда). Производительность также не тестировал.

Пробовал. Проблема в том, что вложенный xml получен из Recordset (MS Access 2000) и там есть MEMO поле, в котором, к сожалению, содержатся картинки, причем записанные в бинарном виде без перевода в текстовый, т.е. содержатся непреемлемые для текста символы.
Так вот когда записываю, то данные после первого такого символа обрубаются.
А если записывать в NodeValue, то ругается на то, что содержатся некорректные символы.

to V.Petrovski
А если без .NET?

to WinterMute
Мне нужно, чтобы все было в одном xml файле.

to kan_izh
Что конкретно ты имеешь в виду в SAX?
Re[3]: Как записать/прочитать XML файл в тэг другого XML фай
От: WinterMute Россия http://yarrr.ru
Дата: 09.08.06 10:26
Оценка:
Здравствуйте, surovi, Вы писали:

S>to WinterMute

S>Мне нужно, чтобы все было в одном xml файле.

По идее, процессор должен вставить содержимое файла как "текст замены", т.е. прочитав repicient.xml, ты получишь DOM содержащий узлы файла source.xml. Или это не то?
Re[4]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 09.08.06 10:38
Оценка:
WM>По идее, процессор должен вставить содержимое файла как "текст замены", т.е. прочитав repicient.xml, ты получишь DOM содержащий узлы файла source.xml. Или это не то?
Если в итоге получится объединенный xml, то вроде бы то.
Приведи пожалуйста небольшой пример кода как записать ссылку в xml.
Re[5]: Как записать/прочитать XML файл в тэг другого XML фай
От: WinterMute Россия http://yarrr.ru
Дата: 09.08.06 11:26
Оценка:
Здравствуйте, surovi, Вы писали:

WM>>По идее, процессор должен вставить содержимое файла как "текст замены", т.е. прочитав repicient.xml, ты получишь DOM содержащий узлы файла source.xml. Или это не то?

S>Если в итоге получится объединенный xml, то вроде бы то.
S>Приведи пожалуйста небольшой пример кода как записать ссылку в xml.

Получится, разумеется, не "xml-файл", а его DOM, если это устраивает, то тот пример, который я приводил ранее, но с некоторыми оговорками:

<!-- source.xml --> <?xml version="1.0" encoding="utf-8"?> <!-- Этот файл не обязательно должен содержать только один корневой элемент, но обязательно должен содержать пролог с указанием кодировки --> Any other content <some> <b>Мама мыла раму</b> </some> <!-- repicient --> <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE some [ <!ENTITY ref SYSTEM "source.xml" > ]> <some> &ref; </some>



-- Такую конструкцию ест IE, но тут есть несколько нюансов: т.к. файлы ты получаешь из БД, то имя "source.xml" не будет найдено процессором, как вариант обхода проблемы -- написать свой сервер (или поставить, например, Apache) и дать некоторым ресурсам из БД адреса. В этом случае адрес включаемой страницы будет записыватся как-то так: "http://localhost/source.xml".
Re[5]: Как записать/прочитать XML файл в тэг другого XML фай
От: WinterMute Россия http://yarrr.ru
Дата: 09.08.06 11:28
Оценка:
Здравствуйте, surovi, Вы писали:

WM>>По идее, процессор должен вставить содержимое файла как "текст замены", т.е. прочитав repicient.xml, ты получишь DOM содержащий узлы файла source.xml. Или это не то?

S>Если в итоге получится объединенный xml, то вроде бы то.
S>Приведи пожалуйста небольшой пример кода как записать ссылку в xml.

Ссылка в XML записывается: &-имя-ссылки-; Или ты что-то другое имел в виду?
Re[6]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 09.08.06 12:14
Оценка:
Спасибо Вам всем за помощь, все оказалось на много проще и на много сложнее.
Код на Delphi

var xml: IXMLDocument; subxml: IXMLDocument; iNode: IXMLNode; SubNode: IXMLNode; begin xml := TXMLDocument.Create(nil) as IXMLDocument; xml.Active := True; xml.Version := '1.0'; xml.Encoding := 'UTF-8'; iNode := xml.AddChild('DATABASE'); SubNode := iNode.AddChild('TableName'); qry.SQL.Add('SELECT * FROM TableName'); qry.SaveToFile('TableName.xml', pfXML); // аналогично команде ADODBRecordset.Save('TableName.xml', adPersistXML); //qry.LoadFromFile('TableName.xml'); // Ошибка subxml := TXMLDocument.Create(nil) as IXMLDocument; subxml.Active := True; subxml.Version := '1.0'; subxml.Encoding := 'UTF-8'; subxml.LoadFromFile('TableName.xml'); SubNode.ChildNodes.Add(subxml.DocumentElement); // Вот то, что искал! xml.SaveToFile('Database.xml');



Так вот, проблема в том, что ADODB.Recordset сохраняет нормально, а вот загрузить, то что сохранил не может, т.к.
в таблице есть MEMO поле (MS Access 2000), в котором хранятся картинки, причем не в закодированном виде (bin.hex или bin.base64),
а просто двоичные данные записаны в MEMO, т.е. с некорректными для текста символами — из-за них он и не может загрузить.
В xml тип для этих полей установлен dt:type='string'.

Скажите пожалуйста, что с этим делать?
Re[7]: Как записать/прочитать XML файл в тэг другого XML фай
От: surovi  
Дата: 10.08.06 09:06
Оценка:
Возникла необходимость переделать написанный код используя DOM, т.к. ADO позволяет сохранять Recordset напрямую в IXMLDOMDocument без использования промежуточного xml файла.
Но при добавлении вложенного документа возникает ошибка:
"This operation can not be performed with a Node of type ELEMENT."

Каким образом тогда можно добавить вложенный документ?

var xmldom: IXMLDOMDocument; subxmldom: IXMLDOMDocument; xmldomNode: IXMLDOMNode; xmldomText: IXMLDOMText; vADODBRecordset: Variant; begin xmldom := CoDOMDocument.Create; xmldom.async := False; xmldom.documentElement := xmldom.createElement('DATABASE'); xmldomText := xmldom.createTextNode('TableName'); xmldomNode := xmldom.documentElement.insertBefore(xmldomText, null); //qry.SQL.Add('SELECT * FROM TableName'); //qry.SaveToFile('TableName.xml', pfXML); // аналогично команде ADODBRecordset.Save('TableName.xml', adPersistXML); subxmldom := CoDOMDocument.Create; subxmldom.async := False; //subxmldom.load('TableName.xml'); vADODBRecordset.Save(subxmldom, adPersistXML); xmldomNode.appendChild(subxmldom.documentElement); // Ошибка xmldom.save('Database.xml');

Re[8]: Как записать/прочитать XML файл в тэг другого XML фай
От: WinterMute Россия http://yarrr.ru
Дата: 10.08.06 09:08
Оценка:
Здравствуйте, surovi, Вы писали:

S>Возникла необходимость переделать написанный код используя DOM, т.к. ADO позволяет сохранять Recordset напрямую в IXMLDOMDocument без использования промежуточного xml файла.

S>Но при добавлении вложенного документа возникает ошибка:
S>"This operation can not be performed with a Node of type ELEMENT."

S>Каким образом тогда можно добавить вложенный документ?


subxmldom.documentElement.firstChild() не проходит?

S>

S>var S> xmldom: IXMLDOMDocument; S> subxmldom: IXMLDOMDocument; S> xmldomNode: IXMLDOMNode; S> xmldomText: IXMLDOMText; S> vADODBRecordset: Variant; S>begin S> xmldom := CoDOMDocument.Create; S> xmldom.async := False; S> xmldom.documentElement := xmldom.createElement('DATABASE'); S> xmldomText := xmldom.createTextNode('TableName'); S> xmldomNode := xmldom.documentElement.insertBefore(xmldomText, null); S> //qry.SQL.Add('SELECT * FROM TableName'); S> //qry.SaveToFile('TableName.xml', pfXML); // аналогично команде ADODBRecordset.Save('TableName.xml', adPersistXML); S> subxmldom := CoDOMDocument.Create; S> subxmldom.async := False; S> //subxmldom.load('TableName.xml'); S> vADODBRecordset.Save(subxmldom, adPersistXML); S> xmldomNode.appendChild(subxmldom.documentElement); // Ошибка S> xmldom.save('Database.xml'); S>

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.