|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от Constantine
![]() rst, почитайте эту тему, может что-то полезное найдете. Я так понимаю, что если у вас значение элемента больше 1024 символов, то работать с ним в НАВе проблематично.
Цитата:
Сообщение от rmv
Для работы с XML забудьте про writetext b пользуйтесь объектами и методами XML - xmlNode.nodeValue, setAttribute и тп., благо их хватает и для записи и для чтения.
Если уже совсем приспичило и размер значения в узле больше 1024 символов у XMLDOmTextNode есть метод substingData для чтения и appendData для записи. Этот объект кстати можно использовать для обхода ограничений в 1024 при передачи значений между COM объектами, к примеру вызвать sql запрос любой длины через adoConnection.execute(XMLDOmTextNode.nodeValue). дело продвигается, победа близка rmv прав. указанных им методов XMLDOM хватает для решения моей конкретной задачи Использовать нужно тип Navision BigText и потоки выглядит примерно так : ...... IXMLDOMText:=XMLDOMDocument.createTextNode(''); Picture.CREATEINSTREAM(InStream); PictureBigText.READ(InStream); BigText2Node(PictureBigText,IXMLDOMText); //это то, что ниже IXMLDOMElement:=XMLDOMDocument.createElement('Picture'); IXMLDOMElement.appendChild(IXMLDOMText); X.appendChild(IXMLDOMElement); ...... и так : ...... LenIntegerRez:=BigText.GETSUBTEXT(BinaryBuff,PosIntegerPar,LenIntegerPar); ...... IXMLDOMText.appendData(TextPar); ...... есть вопросы к вам, коллеги. про тип BigText и его функцию GETSUBTEXT во-первых, прошу напомнить: она возвращает количество считанных символов. т.е. если мы указали считать 10 (третий параметр), а осталось считать только 2, то вернет 2, второй параметр - стартовая позиция, первый - буфер для считываемого значения. прошу напомнить, потому что в справке отсутствует, на экспериментах хочу сэкономить во-вторых задаю вопрос - КАК будет работать GETSUBTEXT с бинарными данными? в моем коде BinaryBuff - это буфер типа Binary. у меня создалось впечатление, что она некорректно работает на бинарных данных есть ли у кого то опыт или просто мнение? хочу поблагодарить за полезную ссылку, во многом оказавшую помощь по теме http://dynamicsuser.net/forums/p/46262/233885.aspx моего коллегу и одновременно руководителя |
|
![]() |
#2 |
Участник
|
раз уж взялся писать - хочу отчитаться о проделанной работе
итог таков для большого текста используем 'Microsoft XML, v6.0'.IXMLDOMText запись выглядит так : MyIXMLDOMText.appendData(MyText); чтение выглядит так : MyBigText.ADDTEXT(MyIXMLDOMText.substringData(FromPosInt,BufLenInt)); для работы с бинарными данными необходимо использовать файлы, методы BigText не работают файлы и BigText сопрягаются потоками как обычно использую Base64 на верхнем уровне : запись : IF SomeRecord.BinData.HASVALUE THEN BEGIN IXMLDOMTextLoc:=XMLDOMDocumentVarPar.createTextNode(''); SomeRecord.BinData.CREATEINSTREAM(InStreamLoc); BinDataBigTextLoc.READ(InStreamLoc); BinDataFileCreatedBooleanLoc:=BinDataFileLoc.CREATETEMPFILE; BinDataFileNameText1024Loc:=BinDataFileLoc.NAME; BinDataFileLoc.CREATEOUTSTREAM(OutStreamLoc); BinDataBigTextLoc.WRITE(OutStreamLoc); EncodeFile2Base64AndWrTextNode(BinDataFileLoc,IXMLDOMTextLoc); BinDataFileLoc.CLOSE; IXMLDOMElementLoc:=XMLDOMDocumentVarPar.createElement('BinData'); IXMLDOMElementLoc.appendChild(IXMLDOMTextLoc); X.appendChild(IXMLDOMElementLoc); END; чтение : GetNodeBigText(X,'BinData',Base64BigTextLoc); IF Base64BigTextLoc.LENGTH>0 THEN BEGIN FileNameText250Loc:=CreateTmpFileName(); //использовать CREATETEMPFILE нельзя BinaryFileLoc.CREATE(FileNameText250Loc); DecodeBase64BigText2File(Base64BigTextLoc,BinaryFileLoc); BinaryFileLoc.CLOSE; SomeRecord.BinData.IMPORT(FileNameText250Loc); ERASE(FileNameText250Loc); END; оптимизация возможна транспорт по HTTP работать должен для меня на этом тема закрыта всем участвовавшим в обсуждении - большое спасибо |
|