импортировать xml с Microsoft Dynamics 2009

Я пытаюсь импортировать файл xml, например:

<?xml version="1.0" encoding="utf-8"?>
<BedrijfsInformatie xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Bedrijfsnaam>TotaalTechniek Europort bv</Bedrijfsnaam>
  <Naam>E.W. Messemaker</Naam>
  <Adres>Deltageul 71</Adres>
  <Postcode>3251 NG</Postcode>
  <Plaats>Stellendam</Plaats>
  <Emailadres>[email protected]</Emailadres>
  <Telefoon>0187-499536</Telefoon>
  <Rechtsvorm>Besloten Vennootschap</Rechtsvorm>
  <Kvk>62.12.963.5</Kvk>
  <BTW>Nl.8546.72.011.B01</BTW>
  <Werkadres />
  <Levering />
  <IBAN />
  <Swift />
  <Betalingswijze>rekening</Betalingswijze>
  <Verzamelfactuur>nee</Verzamelfactuur>
  <Digitalefactuur>ja</Digitalefactuur>
  <EmailDigitalefactuur>[email protected]</EmailDigitalefactuur>
  <Contactpersonen>
    <Contactpersoon>
      <Voornaam>Edwin</Voornaam>
      <Achternaam>Messemaker</Achternaam>
      <Emailadres>[email protected]</Emailadres>
      <Telefoon>0187-499536</Telefoon>
      <Functie>DGA</Functie>
      <Monteur />
      <CanOrder>Ja</CanOrder>
      <CanSeeStock>Ja</CanSeeStock>
      <CanSeeOrder>Ja</CanSeeOrder>
      <CanAddAddress>Ja</CanAddAddress>
      <CanSeePrice>Ja</CanSeePrice>
      <CanSeeCredit>Ja</CanSeeCredit>
      <CanSeePickup>Ja</CanSeePickup>
    </Contactpersoon>
    <Contactpersoon>
      <Voornaam>Gijs</Voornaam>
      <Achternaam>Alphen, van</Achternaam>
      <Emailadres>[email protected]</Emailadres>
      <Telefoon>0651971605</Telefoon>
      <Functie>DGA</Functie>
      <Monteur />
      <CanOrder>Ja</CanOrder>
      <CanSeeStock>Ja</CanSeeStock>
      <CanSeeOrder>Ja</CanSeeOrder>
      <CanAddAddress>Ja</CanAddAddress>
      <CanSeePrice>Ja</CanSeePrice>
      <CanSeeCredit>Ja</CanSeeCredit>
      <CanSeePickup>Nee</CanSeePickup>
    </Contactpersoon>
  </Contactpersonen>
</BedrijfsInformatie>

Но если я делаю импорт, я получаю сообщение об ошибке:

Атрибут wordt niet verwacht. Итак, вторая строка:

<BedrijfsInformatie xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

NAv не принимает. Но если я сделаю так:

<BedrijfsInformatie>

оно работает. Но я не могу сделать это вручную. Потому что файл должен прочитать все его содержимое.

Спасибо

Да, с портом XML это код порта xml:

Documentation()

OnInitXMLport()

OnPreXMLport()

OnPostXMLport()

BedrijfsInformatie - Import::OnAfterInitRecord()

BedrijfsInformatie - Import::OnBeforeInsertRecord()

BedrijfsInformatie - Import::OnAfterInsertRecord()

BedrijfsInformatie - Export::OnPreXMLItem()

BedrijfsInformatie - Export::OnAfterGetRecord()

Bedrijfsnaam - Import::OnAfterAssignField()

Bedrijfsnaam - Export::OnBeforePassField()

Naam - Import::OnAfterAssignVariable()

Naam - Export::OnBeforePassVariable()

Adres - Import::OnAfterAssignVariable()

Adres - Export::OnBeforePassVariable()

Postcode - Import::OnAfterAssignVariable()

Postcode - Export::OnBeforePassVariable()

Plaats - Import::OnAfterAssignVariable()

Plaats - Export::OnBeforePassVariable()

Emailadres - Import::OnAfterAssignVariable()

Emailadres - Export::OnBeforePassVariable()

Telefoon - Import::OnAfterAssignVariable()

Telefoon - Export::OnBeforePassVariable()

Rechtsvorm - Import::OnAfterAssignVariable()

Rechtsvorm - Export::OnBeforePassVariable()

Kvk - Import::OnAfterAssignVariable()

Kvk - Export::OnBeforePassVariable()

BTW - Import::OnAfterAssignVariable()

BTW - Export::OnBeforePassVariable()

Werkadres - Import::OnAfterAssignVariable()


  IF Werkadres = 'verplicht' THEN
    "<Customer>"."Reference Mandatory" := TRUE
  ELSE
    "<Customer>"."Reference Mandatory" := FALSE;

Werkadres - Export::OnBeforePassVariable()

Levering - Import::OnAfterAssignVariable()

  IF Werkadres = 'verplicht' THEN
    "<Customer>"."Job Receipt No. Mandatory" := TRUE
  ELSE
    "<Customer>"."Job Receipt No. Mandatory" := FALSE;

Levering - Export::OnBeforePassVariable()

IBAN - Import::OnAfterAssignVariable()

IBAN - Export::OnBeforePassVariable()

Swift - Import::OnAfterAssignVariable()

Swift - Export::OnBeforePassVariable()

Betalingswijze - Import::OnAfterAssignVariable()

    //Determines which payment method is choosen(rekening, Kontant,automatische incasso in the xml file)
CASE Betalingswijze OF
        'kontant':
           TemplateHeader.Code :='KNT-KLANT';
        'rekening':
           TemplateHeader.Code :='REK-KLANT';
        'automatische incasso':
            TemplateHeader.Code  :='BIN-INC-KL';
        ELSE
        TemplateHeader.Code  :='KONTANT';
  END;

Betalingswijze - Export::OnBeforePassVariable()

Verzamelfactuur - Import::OnAfterAssignField()

Verzamelfactuur - Export::OnBeforePassField()

Digitalefactuur - Import::OnAfterAssignField()

Digitalefactuur - Export::OnBeforePassField()

EmailDigitalefactuur - Import::OnAfterAssignVariable()

EmailDigitalefactuur - Export::OnBeforePassVariable()

Contactpersonen - Import::OnAfterAssignVariable()

Contactpersonen - Export::OnBeforePassVariable()

Contactpersoon - Export::OnPreXMLItem()

Contactpersoon - Export::OnAfterGetRecord()

Contactpersoon - Import::OnAfterInitRecord()

Contactpersoon - Import::OnBeforeInsertRecord()
   "<Contact>".Type := 1;//1 is for Person. 0 is for company

Contactpersoon - Import::OnAfterInsertRecord()


  LoopCount := LoopCount + 1;
    IF FirstContact = '' THEN
      FirstContact := "<Contact>"."No.";

Voornaam - Export::OnBeforePassField()

Voornaam - Import::OnAfterAssignField()

Achternaam - Export::OnBeforePassField()

Achternaam - Import::OnAfterAssignField()

Emailadres - Export::OnBeforePassField()

Emailadres - Import::OnAfterAssignField()

Telefoon - Export::OnBeforePassField()

Telefoon - Import::OnAfterAssignField()

Functie - Export::OnBeforePassField()

Functie - Import::OnAfterAssignField()

Monteur - Export::OnBeforePassField()

Monteur - Import::OnAfterAssignField()

CanOrder - Export::OnBeforePassVariable()

CanOrder - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right1 := TRUE
  ELSE
    "<Contact>".Right1:= FALSE;

CanSeeStock - Export::OnBeforePassVariable()

CanSeeStock - Import::OnAfterAssignVariable()
  IF CanOrder = 'Ja' THEN
    "<Contact>".Right2 := TRUE
  ELSE
    "<Contact>".Right2:= FALSE;

CanSeeOrder - Export::OnBeforePassVariable()

CanSeeOrder - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right3 := TRUE
  ELSE
    "<Contact>".Right3:= FALSE;

CanAddAddress - Export::OnBeforePassVariable()

CanAddAddress - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right4 := TRUE
  ELSE
    "<Contact>".Right4:= FALSE;

CanSeePrice - Export::OnBeforePassVariable()

CanSeePrice - Import::OnAfterAssignVariable()

  IF CanSeePrice = 'Ja' THEN
    "<Contact>".Right5 := TRUE
  ELSE
    "<Contact>".Right5:= FALSE;

CanSeeCredit - Export::OnBeforePassVariable()

CanSeeCredit - Import::OnAfterAssignVariable()
  IF CanOrder = 'Ja' THEN
    "<Contact>".Right6 := TRUE
  ELSE
    "<Contact>".Right6:= FALSE;

CanSeePickup - Export::OnBeforePassVariable()

CanSeePickup - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right7 := TRUE
  ELSE
    "<Contact>".Right7:= FALSE;

UpdateRecord()

и это код для импорта:

Documentation()

Report - OnInitReport()

Report - OnPreReport()

Report - OnPostReport()
IF Filename <> '' THEN ImportFile
ELSE MESSAGE(NoFileText);

Report - OnCreateHyperlink(VAR URL : Text[1024])

Report - OnHyperlink(URL : Text[1024])

UploadFile(VAR FileName : Text[1024])
IF NOT ISSERVICETIER THEN
  NewFileName := CommonDialogMgt.OpenFile(Caption,FileName,4,Filefilter,0)

ELSE
  IF NOT(UPLOAD(Caption,'',Filefilter,FileName,NewFileName)) THEN
    NewFileName := '';

IF NewFileName <> '' THEN
  FileName := NewFileName;

ImportFile()
IF ISSERVICETIER THEN BEGIN
  IF UPLOADINTOSTREAM(
                      'Select the simple.xml file',
                      '\\svdh04\data\NAV docs\webaanmelding\',
                      'XML File *.xml| *.xml',
                       Filename,
                       Stream) THEN
    MESSAGE(ImportCompleteText)
  ELSE
    EXIT;
END
ELSE BEGIN
  dFile.OPEN(Filename);
  dFile.CREATEINSTREAM(Stream);
  IF NOT XMLPORT.IMPORT(50010,Stream) THEN MESSAGE(ErrorText)
  ELSE MESSAGE(ImportCompleteText);
END;

IF NOT ISSERVICETIER THEN dFile.CLOSE;

У меня сейчас так:

//New code:
dFile.TEXTMODE(FALSE);
dFile.OPEN(SavePath);
dFile.CREATEINSTREAM(Stream);
InputText.READ(Stream);
dFile.CLOSE;

TextToFind := 'xmlns=""';
TextPos := InputText.TEXTPOS(TextToFind);
WHILE TextPos <> 0 DO BEGIN
  InputText.GETSUBTEXT(SubText, 1, TextPos - 1);
  OutputText.ADDTEXT(SubText);
  InputText.GETSUBTEXT(InputText, TextPos + STRLEN(TextToFind));
  TextPos := InputText.TEXTPOS(TextToFind);
END;
OutputText.ADDTEXT(InputText);

dFile.TEXTMODE(FALSE);
dFile.CREATE(SavePath);
dFile.CREATEOUTSTREAM(NVOutStream);
OutputText.WRITE(NVOutStream);
dFile.CLOSE;


//End new code

IF ISSERVICETIER THEN BEGIN
  IF UPLOADINTOSTREAM(
                      'Select the simple.xml file',
                      '\\svdh04\data\NAV docs\webaanmelding\',
                      'XML File *.xml| *.xml',
                       Filename,
                       Stream) THEN
    MESSAGE(ImportCompleteText)
  ELSE
    EXIT;
END
ELSE BEGIN
  dFile.OPEN(Filename);
  dFile.CREATEINSTREAM(Stream);
  IF NOT XMLPORT.IMPORT(50010,Stream) THEN MESSAGE(ErrorText)
  ELSE MESSAGE(ImportCompleteText);
END;

IF NOT ISSERVICETIER THEN dFile.CLOSE;

Но затем я получаю эту ошибку:

введите здесь описание изображения

хорошо, я изменил сейчас на это:

//New code:
dFile.TEXTMODE(FALSE);
dFile.OPEN(Filename);

dFile.CREATEINSTREAM(Stream);
InputText.READ(Stream);
dFile.CLOSE;

TextToFind := 'xmlns=""';
TextPos := InputText.TEXTPOS(TextToFind);
MESSAGE(FORMAT(TextPos));
WHILE TextPos <> 0 DO BEGIN
  InputText.GETSUBTEXT(SubText, 1, TextPos - 1);
  OutputText.ADDTEXT(SubText);
  InputText.GETSUBTEXT(InputText, TextPos + STRLEN(TextToFind));
  TextPos := InputText.TEXTPOS(TextToFind);
END;
OutputText.ADDTEXT(InputText);

dFile.TEXTMODE(FALSE);
dFile.CREATE(Filename);
dFile.CREATEOUTSTREAM(NVOutStream);
OutputText.WRITE(NVOutStream);
dFile.CLOSE;


//End new code

IF ISSERVICETIER THEN BEGIN
  IF UPLOADINTOSTREAM(
                      'Select the simple.xml file',
                      '\\svdh04\data\NAV docs\webaanmelding\',
                      'XML File *.xml| *.xml',
                       Filename,
                       Stream) THEN
    MESSAGE(ImportCompleteText)
  ELSE
    EXIT;
END
ELSE BEGIN
  dFile.OPEN(Filename);
  dFile.CREATEINSTREAM(Stream);
  IF NOT XMLPORT.IMPORT(50010,Stream) THEN MESSAGE(ErrorText)
  ELSE MESSAGE(ImportCompleteText);
END;

IF NOT ISSERVICETIER THEN dFile.CLOSE;

Но проблема в том, что:

TextPos := InputText.TEXTPOS(TextToFind);

ТекстПос равен 0.

Спасибо


person InfinityGoesAround    schedule 10.02.2016    source источник
comment
Как вы импортируете свой XML? С XML-портами? Можете ли вы опубликовать свой код?   -  person etalon11    schedule 10.02.2016
comment
Привет, редактирую пост с кодом   -  person InfinityGoesAround    schedule 10.02.2016


Ответы (1)


Да, потому что NAV 2009 не поддерживает пространства имен в XMLports.

Решение находится здесь: Сначала необходимо удалить пространство имен с помощью преобразования xml

Ваше здоровье!

person azatoth    schedule 10.02.2016
comment
Да, я знаю это. Но именно поэтому я добавил в функцию новый функционал, чтобы она избавлялась от xmlns. - person InfinityGoesAround; 11.02.2016
comment
Да, но ваша функция неверна. Вы должны использовать преобразование xml для создания правильного xml - person azatoth; 11.02.2016
comment
Да, окей. Но что я должен изменить в коде, который я опубликовал. Потому что, если TextPos больше не равен 0, он будет работать. Но пока не могу понять как сделать не 0. Спасибо - person InfinityGoesAround; 11.02.2016
comment
?? Добро пожаловать за что? Извините, но вы что-то изменили в коде, который я отправил? - person InfinityGoesAround; 11.02.2016