XMLDocument SaveToFile w jednej linii

0

Witam!
Mam problem.
Mam obiekt klasy TXMLDocument.
Zapisuje go do pliku tak:

XMLDoc.DocumentElement.AddChild('tt_zam');
msNode:=XMLDoc.DocumentElement.ChildNodes[1];

  msNode.AddChild('KODZAM');
  msNode.ChildNodes[0].Text:='1041500001';

  .......

  XMLDoc.Encoding:='UTF-8';
  XMLDoc.Version:='1.0';
  XMLDoc.SaveToFile('export.xml');

W pliku wszystko jest w jednej linii, a chciałabym, żeby każdy tag był w kolejnej.
przykład:

jest:

<?xml version="1.0" encoding="UTF-8"?> ... <tt_zam><kodzam>1041500001</kodzam><dokdata>2007-08-28</dokdata><datazatw>2007-08-28</datazatw><datadost>2007-08-28</datadost><symbolph>LB0275</symbolph><zamid>4449</zamid><odbid>4449</odbid><dostid>ESP</dostid><dokument>22Faktura</dokument><formazap /><terzap>45</terzap><iloscpoz>4</iloscpoz><wartosc>516</wartosc><wartoscbr>516</wartoscbr><opiszam /><zrodcen>O</zrodcen><rabat>0</rabat><twpromid /><promid /><prompkt>0</prompkt></tt_zam> ....

chciałabym mieć:

<?xml version="1.0" encoding="UTF-8"?>

...
<tt_zam>
<KODZAM>1041500001</KODZAM>
<DOKDATA>2007-08-28</DOKDATA>
<DATAZATW>2007-08-28</DATAZATW>
<DATADOST>2007-08-28</DATADOST>
<SYMBOLPH>LB0275</SYMBOLPH>
<ZAMID>4449</ZAMID>
<ODBID>4449</ODBID>
<DOSTID>ESP</DOSTID>
<DOKUMENT>22Faktura</DOKUMENT>
<FORMAZAP/>
<TERZAP>45</TERZAP>
<ILOSCPOZ>4</ILOSCPOZ>
<WARTOSC>516</WARTOSC>
<WARTOSCBR>516</WARTOSCBR>
<OPISZAM/>
<ZRODCEN>O</ZRODCEN>
<RABAT>0</RABAT>
<TWPROMID/>
<PROMID/>
<PROMPKT>0</PROMPKT>
</tt_zam>
....

pozdrawiam
Goth_Doll

0

Options->doNodeAutoIndent := true

0

niestety to nie pomaga :(
ale dzięki za szybką reakcję

0

W takim razie

ParseOptions->poPreserveWhiteSpace := true;

:)
Dawno nie używałem - stąd oszybka w pierwszej odpowiedzi :)

0

Nadal bez zmian :(

0

A jakie masz inne ustawienia?
Bo... U MNIE TO DZIAŁA :)

0

żadna z opcji Options i ParseOptions nie daje mi pożądanego efektu :(

XMLDoc.Encoding:='UTF-8'; XMLDoc.Version:='1.0'; XMLDoc.Options := XMLDoc.Options + [doNodeAutoIndent]; XMLDoc.Options := XMLDoc.Options + [doNodeAutoCreate]; XMLDoc.Options := XMLDoc.Options + [doAttrNull]; XMLDoc.Options := XMLDoc.Options + [doAutoPrefix]; XMLDoc.Options := XMLDoc.Options + [doNamespaceDecl]; XMLDoc.Options := XMLDoc.Options + [doAutoSave];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poPreserveWhiteSpace];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poResolveExternals];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poValidateOnParse];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poAsyncLoad];

XMLDoc.SaveToFile('export1.xml');

posłuchaj, muszę dodać, że nie używam komponentu XML tylko obiektu klasy TXMLDocument

w uproszczeniu wygląda to mniej więcej tak::

XMLDoc:= TXMLDocument.Create(nil);
XMLDoc.Active:=true;

XMLDoc.AddChild('ds_dane');

XMLDoc.DocumentElement.AddChild('tt_zam');
msNode:=XMLDoc.DocumentElement.ChildNodes[1];

msNode.AddChild('KODZAM');
msNode.ChildNodes[0].Text:='123456789';
msNode.AddChild('ID');
msNode.ChildNodes[1].Text:='0011';

XMLDoc.Encoding:='UTF-8';
XMLDoc.Version:='1.0';

XMLDoc.Options := XMLDoc.Options + [doNodeAutoIndent];
XMLDoc.Options := XMLDoc.Options + [doNodeAutoCreate];
XMLDoc.Options := XMLDoc.Options + [doAttrNull];
XMLDoc.Options := XMLDoc.Options + [doAutoPrefix];
XMLDoc.Options := XMLDoc.Options + [doNamespaceDecl];
XMLDoc.Options := XMLDoc.Options + [doAutoSave];

XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poPreserveWhiteSpace];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poResolveExternals];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poValidateOnParse];
XMLDoc.ParseOptions := XMLDoc.ParseOptions +[poAsyncLoad];

XMLDoc.NodeIndentStr:='  ';

XMLDoc.SaveToFile('export1.xml');

po czym mam w pliku:

<?xml version="1.0" encoding="UTF-8"?>

<ds_dane><tt_zam><KODZAM>1041500001</KODZAM><ID>0011</ID></tt_zam></ds_dane>

a potrzebuje mieć:

<?xml version="1.0" encoding="UTF-8"?>

<ds_dane>
<tt_zam>
<KODZAM>1041500001</KODZAM>
<ID>0011</ID>
</tt_zam>
</ds_dane>

0

To może spróbuj zamiast
XMLDoc.DocumentElement.AddChild('tt_zam');
wpisać:
XMLDoc.DocumentElement.AddChild('tt_zam\r\n');

Jeśli używasz Windowsa. A jeśli Linuxa to:
XMLDoc.DocumentElement.AddChild('tt_zam\n');

0

niestety mam błąd:

"Nazwa nie może zawierać znaku '\'."

ps. piszę pod win

0

Ja tam miałem jakieś "Index out of bounds", ale mniejsza o to.
Błąd polega na tym, że ustawiasz opcje PO zapisie elementów do dokumentu.

Przenieś ustawianie na początek, zanim zaczniesz grzebać w dokumencie - to zadziała :).

A tak już dla zupełnej poprawności - możesz zastosować konstrukcję

    XMLDoc.Options := [doNodeAutoIndent, doNodeAutoCreate, doAttrNull, doAutoPrefix, doNamespaceDecl, doAutoSave];

    XMLDoc.ParseOptions := [poPreserveWhiteSpace,  poResolveExternals, poValidateOnParse, poAsyncLoad];
0

Może trzeba podwoić znak "" i zapisać
\r\n
Spróbuj, możliwe że zadziała. Jednak mimo wszystko w tej klasie powinna być jakaś inna opcja:)

0

przykład (działający ;) ):

procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDoc: TXMLDocument;
  msNode,msNode2: IXMLNode;
begin
    XMLDoc:= TXMLDocument.Create(XMLDOc);

    XMLDoc.Active:=true;
    XMLDoc.Options := [doNodeAutoIndent, doNodeAutoCreate, doAttrNull,
                       doAutoPrefix, doNamespaceDecl];

    XMLDoc.AddChild('ds_dane');
    msNode:= XMLDoc.DocumentElement.AddChild('tt_zam');
    msNode2 := msNode.AddChild('KODZAM');
    msNode2.Text :='123456789';
    msNode2 := msNode.AddChild('ID');
    msNode2.Text:='0011';

    XMLDoc.SaveToFile('D:\export1.xml');
    XMLDoc.Encoding:='UTF-8';
    XMLDoc.Version:='1.0';

    XMLDoc.Free;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1