Как записать/прочитать 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.
Re: Как записать/прочитать XML файл в тэг другого XML файла?
От: WinterMutehttp://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 фай
От: WinterMutehttp://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 фай
От: WinterMutehttp://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 фай
От: WinterMutehttp://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 фай
От: WinterMutehttp://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...
Пока на собственное сообщение не было ответов, его можно удалить.