Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Visual Basic XML - Zapis pliku xml

marcin_rs 27 Lut 2015 11:44 1860 11
  • #1 27 Lut 2015 11:44
    marcin_rs
    Poziom 9  

    Witam Ekspertów!

    Bardzo proszę o pomoc, chce zrealizować zapis wyników w pliku xml
    Jedyne do czego udało mi się dojść to zapis w pliku tekstowym. Na forach doszukałem się że trzeba najpierw stworzyć tabele a potem dopiero zapisywać... wszelkie próby zakończyły się fiaskiem :(

    Programik pobiera ze sterownika dane i zapisuje je w ten sposób:

    DM0000 1036
    DM0001 0318

    (nazwa / wartość)
    to w zasadzie się nie zmienia jedynie liczba linii

    część programu wygląda następująco:

    Dim str_out As String = ""
    txt_read2.Text = ""

    Try
    For I As Integer = 0 To reg_count - 1
    str_out = str_out & "DM" & (reg_start + I).ToString().PadLeft(4, "0"c) & " " & str_read.Substring(I * 4, 4) & vbNewLine
    Next

    Catch ex As Exception
    str_out = "No datat is available"
    End Try
    txt_read2.Text = str_out

    Dim a As String = "C:\test.txt"
    My.Computer.FileSystem.WriteAllText(a, txt_read2.Text, False)

    0 11
  • #2 28 Lut 2015 14:46
    marek_s1
    Poziom 13  

    Plik xml ma swoją strukturę, którą musisz określić - roota, tagi, wartości, opisy itp.

    Xml można zrobić za pomocą generatorów albo po prostu zapisywać do pliku tekstowego. Nie podałeś w jaki programie piszesz.

    Przykład z WIKI:

    Kod: xml
    Zaloguj się, aby zobaczyć kod


    Nie jest to specjalnie skomplikowane, dlatego też dla prostych danych szybciej jest generować tagi kodem.

    0
  • #3 01 Mar 2015 19:44
    marcin_rs
    Poziom 9  

    Dzięki za szybką odpowiedź

    Programuję to w MS Visual Basic 2010 Express (programuję to za dużo powiedziane bardziej przerabiam gotowca…).

    Chciałem zgodnie z Twoją radą zapisać wartości od razu w pliku i prawie by się udało gdyby nie " cudzysłowy" VB wywala mi błąd :/

    gdyby plik wyglądał tak było by dobrze :


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

    <dane>

    <DM0000>0012</DM0000>
    <DM0001>0045</DM0001>
    <DM0002>0132</DM0002>
    <DM0003>1023</DM0003>
    <DM0004>2106</DM0004>

    </dane>


    a udaje mi się zapisać tylko tak:

    <?xml version=1.0 encoding=utf-8 ?>


    Jaki jest sposób aby obejść te cudzysłowy - zapisuje w VB tak:

    Dim str_out As String = " <?xml version=1.0 encoding=UTF-8?> " & vbNewLine & "<dane>" & vbNewLine

    ale wtedy nie ma poprawnego nagłówka :/

    Nagłówek powinien wyglądać tak:

    Dim str_out As String = " <?xml version=”1.0” encoding=”UTF-8”?> " & vbNewLine & "<dane>" & vbNewLine

    0
  • #4 01 Mar 2015 20:15
    JRV
    Specjalista - VBA, Excel

    Witaj
    " = Chr(34)

    Dodano po 2 [minuty]:

    str_out = " <?xml version=” & Chr(34) & "1.0” & Chr(34) & "encoding=” & Chr(34) & "UTF-8” & Chr(34) & "?> "
    albo = "<?xml version=""1.0"" encoding=""UTF-8""?> "

    0
  • #5 01 Mar 2015 21:03
    marcinj12
    Poziom 40  

    To DM0000, DM0001 to pewnie jakieś rejestry ze sterownika? Czy ich liczba będzie stała w tym pliku XML i czy ten układ co podałeś, jest "jedynym słusznym"?

    0
  • #6 02 Mar 2015 18:57
    marcin_rs
    Poziom 9  

    Dzięki! Super działa!
    Zgadza się ze sterownika Omron CQM1H docelowo liczba pobieranych rejestrów będzie różna jednak to nie będzie wpływało podejrzewam na xml’a ponieważ mam zrobiony nagłówek -> pętla pobierania rejestrów -> zakończenie.

    Przy okazji jeszcze jedno pytanie jak zapętlić program w nieskończoność (aż do zamknięcia) chodzi mi konkretnie tak:

    1. program się wykona
    2. odczeka np. 15 sekund
    3. wykona się ponownie

    tak w koło…

    nie potrafię tak ładnie wklejać kodu jak inni to robią więc dołączam plik jeśli miało by to ułatwić

    Pozdrawiam
    Marcin

    0
  • #7 02 Mar 2015 19:18
    JRV
    Specjalista - VBA, Excel

    Witaj
    W ogóle, to pytanie do programistów VB, mam więcej VBA, ale te POBIERANIE - to reakcji na zdarzenia?
    Co było przyczyną zdarzenia form_Main Load? ..Load2 ..Load3.
    Moim zdaniem petli powinien organizować te zdarzenia, które powodują reakcję.

    Dodano po 10 [minuty]:

    marcin_rs napisał:
    zapętlić program w nieskończoność

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #8 02 Mar 2015 20:50
    NAXIN
    Poziom 22  

    Dzień dobry. Zapis XML jest standardem więc nie ma sensu bawić się w pisanie algorytmów do zapisywania w takim formacie :)

    Napisałem takie makro, mam nadzieję, że się przyda:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Będziesz jedynie musiał dodać referencję do obsługi XML-a. U mnie robię to w menu Tools>References i z listy zaznaczam Microsoft XML 6.0

    Po odpaleniu plik wygląda tak:
    Code:
    <Dane><DM0000>0012</DM0000><DM0002>0045</DM0002><DM0003>1023</DM0003></Dane>

    0
  • #9 02 Mar 2015 20:55
    marek_s1
    Poziom 13  

    pętlę trzeba przemyśleć pod kątem:

    1. akcji start/stop
    2. obsługi błędów i niepoprawnych wykonywań funkcji w petli

    W kodzie, pętla czytająca przy dowolnym błędzie zwróci
    str_out = "No datat is available"

    A co kiedy dane są ale są niepoprawne tylko np. niepełne?
    Nie sprawdzasz czy substring istnieje i czy długość str_read jest wielokrotnością 4.

    0
  • #11 12 Mar 2015 22:39
    marcinj12
    Poziom 40  

    marcin_rs napisał:
    Co w tym kodzie jest nie tak:

    Niby działa poprawnie ale na pasku tytułowym znika nazwa a pojawia się zapisywany kod w pliku?
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
    Sam tam zapisujesz...

    0
  • #12 12 Gru 2015 09:06
    marcin_rs
    Poziom 9  

    Witam po przerwie

    Dziękuję za okazaną pomoc wszystko działa jak należy.
    Gdy znajdę trochę czasu założę nowy temat,
    aby się pochwalić działaniem całości; zwłaszcza tym,
    którzy twierdzili, że "staruszka" Omron CQM1 nie da się wizualizować ;)

    Pozdrawiam!

    0