Zmiana wartości w pliku XML, jednoczesny odczyt i zapis

0

Hej,

Piszę skrypt który dekompresuje CRTF zawarte w plikach XML. Jako że z programowanie u mnie kiepsko :) zadanie jest lekko karkołomne :). Jestem na etapie wyciągania danych z pliku XML i wstawianiu ich w określone miejsca do kopii tego samego pliku. Wszystko szło ładnie jednak mam problem, nie mogę sobie poradzić z obejściem błędu wynikającego z jednoczesnego odczytu i zapisu z jedno pliku. Wstawię kod może ktoś pomoże obejść ten problem. Z góry dzięki za pomoc

 using System;
using System.Xml;
using System.Text;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i=0;
            XmlTextReader xtr = new XmlTextReader("c://PlikEksportu.bcm");
              String[] tab = new String[4900];
                while (xtr.Read())
                {
                    if (xtr.MoveToContent() == XmlNodeType.Element && xtr.Name == "CompressedRichText")
                    {
                        tab[i]="test";
                        i++;


                    }

                }
              
                Console.WriteLine(i);
                XmlTextReader xtrz = new XmlTextReader("c://test.bcm");
                XmlTextWriter xtw = new XmlTextWriter("c://test.bcm",Encoding.Default);
                xtw.Formatting = Formatting.Indented;
                i=0;
                while (xtrz.Read())
                {
                    if (xtrz.MoveToContent() == XmlNodeType.Element && xtr.Name == "CompressedRichText")
                    {
                        xtw.WriteString(tab[i]); // TU WYSTĘPUJE OPISANY PROBLEM 
                        i++;


                    }

                }

               

                for (int x = 0; x <= i; x++)
                {
                    Console.WriteLine(tab[x]);
                }



                Console.Read();
               
        }
    }
}
0

A duże te pliki? Nie możesz użyć XmlDocument?

1

Wygodniejszą klasą do obsługi XML jest XmlDocument, a IMO najwygodniejszą (niedawno ją odkryłem) XDocument - obydwie mogą jednocześnie czytać i pisać do pliku.
Co konkretnie chcesz zrobić to ci pomogę dokładniej? :)

0
somekind napisał(a)

A duże te pliki? Nie możesz użyć XmlDocument?

16k rekordów baza

0
MSM napisał(a)

Wygodniejszą klasą do obsługi XML jest XmlDocument, a IMO najwygodniejszą (niedawno ją odkryłem) XDocument - obydwie mogą jednocześnie czytać i pisać do pliku.
Co konkretnie chcesz zrobić to ci pomogę dokładniej? :)

A więc tak :), dostałem w robocie zadanie wdrożenia sugarCRM, firma wcześniej pracowała na dodatku BCM do Outlooka, jest on niestety strasznie obciążający po stronie klienta. Ogólnie z sugarem wszystko idzie miło, eksportuje BCMową bazę do csv i importuje ją do SUGARA. Problemem jest historia przenoszonych kontaktów. Pod historią rozumiem liczne notatki związane z konkretnymi kontaktami. Notatki zaszyfrowane za pomocą compressed rich text format. Jedyną opcją aby wyeksportować je z BCM'a jest użycie formatu BCM, który jest właściwie XML'em.

Co chcę zrobić? Wyjąć skompresowane notatki, z dekompresować je i wrzucić z powrotem do pliku. Następnie przekonwertować XML do CSV i grzecznie zaimportować do Sugara :). Znalazłem bibliotekę do c# dekompresującą CRTF więc, właściwie potrzebuje wyjąć dane (udało się) wrzucić je do tabeli(udało się) wywalić z tabeli do funkcji dekompresującej (będę próbował później) znów wrzucić do tabeli już z dekompresowane (myślę że to nie będzie problem) i zapisać do pliku(i tu mam problem)

0
kfiacior napisał(a)
somekind napisał(a)

A duże te pliki? Nie możesz użyć XmlDocument?

16k rekordów baza

[rotfl]
To faktycznie jest informacja o wielkości pliku. :D :D :D

0
somekind napisał(a)
kfiacior napisał(a)
somekind napisał(a)

A duże te pliki? Nie możesz użyć XmlDocument?

16k rekordów baza

[rotfl]
To faktycznie jest informacja o wielkości pliku. :D :D :D

Ja uważam że jest to info dotyczące wielkości pliku, info w megabajtach - 15.

0
kfiacior napisał(a)

Ja uważam że jest to info dotyczące wielkości pliku

Znaczy Twoim zdaniem rekord jest miarą wielkości pliku? [rotfl] [rotfl] [rotfl]

Dowiedz się najpierw co to są pliki i bajty, potem bierz się za programowanie.

0
somekind napisał(a)
kfiacior napisał(a)

Ja uważam że jest to info dotyczące wielkości pliku

Znaczy Twoim zdaniem rekord jest miarą wielkości pliku? [rotfl] [rotfl] [rotfl]

Dowiedz się najpierw co to są pliki i bajty, potem bierz się za programowanie.

Widzę że na każdym forum, musi znaleźć się cwaniaczek. Chcesz zabsłysnąc pomóż rozwiązać problem a nie flameujesz i spamujesz na forach internetowych. Nie chcesz pomóc nie pisz nic. Co do rekordów to nadal będę utrzymywał że ich ilość świadczy o wielkości pliku, a w tym przypadku informacje ta jest istotniejsza niż fizyczny rozmiar pliku.

0

Zrozum, że to czy możesz użyć XMlDocument/XDocument zależy od rozmiaru pliku, nie liczby rekordów. Jeśli plik będzie zbyt wielki, to nie zmieści się do pamięci, wtedy trzeba operować na nim sekwencyjnie. Liczba rekordów nie jest żadną informacją o fizycznym rozmiarze pliku. Proste i logiczne, ale jeśli uważasz, że to nie jest prawda, to udowodnij.

0
somekind napisał(a)

Zrozum, że to czy możesz użyć XMlDocument/XDocument zależy od rozmiaru pliku, nie liczby rekordów. Jeśli plik będzie zbyt wielki, to nie zmieści się do pamięci, wtedy trzeba operować na nim sekwencyjnie. Liczba rekordów nie jest żadną informacją o fizycznym rozmiarze pliku. Proste i logiczne, ale jeśli uważasz, że to nie jest prawda, to udowodnij.

no i nie można było tak od razu :), zresztą rozwiązałem problem (prawie) w javie, więc nie będę Wam już smęcił

0

Ja nie rozumiem tylko jednego - czemu się uparłeś, że to ma być ten sam plik?
Tak w ogóle, to do przetwarzania XML -> cokolwiek używa się chyba XSLT.

0
somekind napisał(a)

Ja nie rozumiem tylko jednego - czemu się uparłeś, że to ma być ten sam plik?
Tak w ogóle, to do przetwarzania XML -> cokolwiek używa się chyba XSLT.

chodi o to że wyciagniete dane po przerobieniu muszą trafić do pliku o identycznej strukturze z identycznymi pozostałymi danymi

0

A możesz pokazać kawałek takiego pliku przed i po przerobieniu?

0
somekind napisał(a)

A możesz pokazać kawałek takiego pliku przed i po przerobieniu?

jutro jak będę w robocie to wkleje

0
<BCMEntities version="3,0" bcmlocale="pl-PL" hasheader="True" hascustomizationschema="True">
    <Header>
        <EntityCount>
            <Contacts>661</Contacts>
            <Campaigns>0</Campaigns>
            <UserFields>40</UserFields>
            <PickLists>15</PickLists>
        </EntityCount>
        <ChangesSinceVersion>0</ChangesSinceVersion>
    </Header>
    <CustomizationSchema>
        <UserFields>
            <Contact>
                <UserField FieldType="Picklist">
                    <FieldName>ENG</FieldName>
                    <FieldGUID>b9a5ef37-7df5-4461-8d5e-f609f98efec5</FieldGUID>
                    <FieldDisplayFormatIndex>1</FieldDisplayFormatIndex>
                    <Picklist>
                        <Id>b9a5ef37-7df5-4461-8d5e-f609f98efec5</Id>
                        <Values>
                            <Default />
                            <GuidAndValue>
                                <Guid>5433be6d-5aa6-477f-812a-00d689f3e402</Guid>
                                <Value>Początkujący</Value>
                            </GuidAndValue>
                            <GuidAndValue>
                                <Guid>02eae3b7-9f4e-49f8-98a7-df085c7d0cb3</Guid>
                                <Value>Średniozaawansowany</Value>
                            </GuidAndValue>
                            <GuidAndValue>
                                <Guid>421abfe0-5015-43f2-8857-dca9d90647ab</Guid>
                                <Value>Zaawansowany</Value>
                            </GuidAndValue>
                            <GuidAndValue>
                                <Guid>7ca04138-9f79-45f1-8924-e6c2e67add36</Guid>
                                <Value>Biegły</Value>
                            </GuidAndValue>
                        </Values>
                    </Picklist>
                    <Location>
                        <Area>GeneralTab</Area>
                        <Column>Left</Column>
                        <Group>Języki obce</Group>
                    </Location>
                </UserField> 

Mała pomyłka co do rozmiaru pliku, docelowy będzie ważył nie 15 mega a 1,5 giga

0

i tu fragment który miałby podlega edycji

 <Activity>
            <ActivityGUID>14633640-92fa-4e1a-a5fa-9f98b0799276</ActivityGUID>
            <ActivityType>3</ActivityType>
            <Subject>******</Subject>
            <ActivityDate>Thu, 30 Dec 2010 14:46:00 GMT</ActivityDate>
            <CreatedOn>Thu, 30 Dec 2010 14:46:02 GMT</CreatedOn>
            <CreatedBy>SERVER\******</CreatedBy>
            <ModifiedBy>SERVER\******/ModifiedBy>
            <ModifiedOn>Mon, 17 Jan 2011 16:31:04 GMT</ModifiedOn>
            <ActivityDuration>0</ActivityDuration>
            <ActivitySentTime>Thu, 30 Dec 2010 14:46:00 GMT</ActivitySentTime>
            <ActivityPercentComplete>0</ActivityPercentComplete>
            <LinkToOriginal>000000001BB070BF782746438E809DE139C91151A4882000</LinkToOriginal>
            <CompressedRichText>2F070000380D00004C......8FDCFFDE0F1BE213710001E070</CompressedRichText>
            <IconIndex>1538</IconIndex>
            <MessageDeliveryTime>Thu, 30 Dec 2010 14:46:04 GMT</MessageDeliveryTime>
        </Activity>

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