У моего нового TXMLDocument DocumentElement==NULL
Хочу его заполнить руками и сохранить в файл
Только стал заполнять, а у него
XmlMainDoc->DocumentElement==NULL :(
Я ему тогда
XmlMainDoc->AddChild("XXX");
Ну и в документе у меня этот XXX стал верхним узлом.
А мне надо по-нормальному чтобы было: верхний узел
<?xml version="1.0" encoding="Windows-1251"?>
Вопрос: как инициировать DocumentElement?
Спасибо
-Олег
_di_IXMLNode sel = (_di_IXMLNode &)Tree->Selected->Data;
_di_IXMLNodeList selchild = sel->GetChildNodes();
for(int i = 0; i<selchild->Count; i++)
{
try
{
String file_name = selchild->Nodes->GetAttribute("ФАЙЛ");
DeleteFileA(DIR + "\\" + file_name);
int filehandle = FileCreate(DIR + "\\" + file_name);
String temp = "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\n";
FileWrite(filehandle, temp.c_str(), temp.Length());
temp = "<ГЛАВНЫЙ></ГЛАВНЫЙ>";
FileWrite(filehandle, temp.c_str(), temp.Length());
FileClose(filehandle);
//TXMLDocument *UP = new TXMLDocument(DIR + "\\" + file_name);
UP->LoadFromFile(DIR + "\\" + file_name);
UP->Active = true;
try
{
_di_IXMLNode MAIN_NODE = UP->ChildNodes->Nodes[1];
//прописываем аттрибуты
_di_IXMLNodeList attr = selchild->Nodes->GetAttributeNodes();
for(int j = 0; j < attr->Count; j++)
MAIN_NODE->SetAttribute(attr->Nodes[j]->NodeName, attr->Nodes[j]->Text);
//начинаем загонять данные
_di_IXMLNodeList nodes = selchild->Nodes->GetChildNodes();
for(int j = 0; j < nodes->Count; j++)
MAIN_NODE->ChildNodes->Add(nodes->Nodes[j]);
UP->SaveToFile(DIR + "\\" + file_name);
}
__finally
{
UP->Active = false;
}
}
catch(Exception &e)
{
Application->MessageBoxA(
("Ошибка выгрузки данных"+selchild->Nodes->NodeName+
"\n" + e.Message).c_str()
,"Ошибка",MB_OK|MB_ICONHAND);
}
}
Я взял твою идею создавать вручную верхнюю строку и верхний узел и
у меня тоже заработало!
Скажи, это ты сам придумал или где видел? Дело в том, что этот прием, по-моему, мог родиться только от безысходности. Я ожидал, что должны существовать более цивилизованные способы инициации нового документа.
Впрочем, такой выход меня тоже вполне устраивает.
Спасибо
-Олег
PS помОссируйте -> помАссируйте
Тысяча благодарностей!
Я взял твою идею создавать вручную верхнюю строку и верхний узел и
у меня тоже заработало!
Скажи, это ты сам придумал или где видел? Дело в том, что этот прием, по-моему, мог родиться только от безысходности. Я ожидал, что должны существовать более цивилизованные способы инициации нового документа.
Впрочем, такой выход меня тоже вполне устраивает.
Спасибо
-Олег
PS помОссируйте -> помАссируйте
В принципе можно и собственно весь файл так записывать...можно и свой стандарт xml написать...мы все попрежнему идем своим путем, следуя заветам дедушки ленина...:)) на фига нам соурсы и хелпы...
TStringStream *Stream = new TStringStream(StringXML);
xml->LoadFromStream(Stream);
xml->SaveToFile(WideString("catalog.xml"));
AnsiString StringXML = "<?xml version=\"1.0\"?><Rigel></Rigel>";
TStringStream *Stream = new TStringStream(StringXML);
xml->LoadFromStream(Stream);
xml->SaveToFile(WideString("catalog.xml"));
[/code]
Со стримом чуть по-красивее, чем предварительная запись в файл. НО принципиальной разницы нет: по прежнему <?xml version=\"1.0\"?> и DocumentElement создаются вручную. Правильно говоришь, можно так продолжать и дальше, пока весь код не забьешь.
По-хорошему если уж <?xml...?> парсится _оттуда_, то должно быть средство культурно его загнать _туда_ для нового xml документа. То же касается DocumentElement. Когда я пишу пмсьмо, я руками вначале не прописываю Return-Path, Delivered-To т.д.
Я подправил у себя с твоим стримом. Спасибо. Работает.
-Олег