Articolul prezintă cum să citiți elegant fișierele XML mari
Dacă trebuie să citiți fișierul XML, puteți aplica una dintre abordările: încărcare completă în DOM și citire secvențială. Descărcarea completă a fișierului XML din DOM este implementată în 1C utilizând obiectul Document DOM. DOM-ul este cool, dar nu voi vorbi astăzi, deoarece este vorba despre fișiere XML relativ mari, iar DOM nu se potrivește. Citirea secvențială a fișierelor XML este implementată în 1C cu ajutorul unui astfel de obiect ca Reading XML. Există și alte obiecte în 1C pentru lucrul cu XML, dar astăzi, din nou, nu despre ele.
Obiectul Read XML este un reprezentant viu al abordării citirii secvențiale a fișierului XML. Sunt sigur că vă puteți imagina cum arată codul folosind obiectul Read XML. Are bucle și multe condiții pentru a compara tipul și numele nodului. Nu-mi place acest cod și nu-mi place să-l scriu. Dacă nu vă puteți imagina cum arată astfel de cod, atunci rezolvați sarcina demonstrativă descrisă mai jos utilizând obiectul Read XML și veți înțelege despre ce vorbesc.
La intrare, fișierul Accounts.xml conține următoarea structură și conținut:
Implementăm încărcarea contrapartidelor în procesul de "Descărcare contrapărți". Când faceți clic pe butonul "Descărcați", se execută următorul cod:
Mai întâi, creați o procesare generică pentru ElegantXML și apelați metoda Read. Primul argument este numele fișierului XML. Al doilea argument este transmis unui obiect delegat special. Procesarea prin citirea unui fișier XML pornește secvențial metodele obiectului delegat atunci când se citește nodul, când se citește nodul și alte cazuri.
Obiectul delegat trebuie să implementeze următoarele metode:
1. Procedura Start (Read XML) Export - această procedură este pornită când fișierul XML este procesat, poate iniția orice variabile și poate seta obiectul Read XML
2. Finalizarea funcțiilor () Export - această funcție este lansată ultima dată și ar trebui să returneze rezultatul prelucrării fișierelor, poate reveni și este nedefinită - acest lucru este normal
3. Funcția NodeOpen (Read XML, Node) Export - această funcție este pornită de fiecare dată când un nod nou începe procesarea. Parametrul gazdă conține informațiile deja citite despre nod: numele local, URI-ul spațiului de nume, tabela atributului ș.amd Parametrul Read XML este trecut astfel încât să puteți completa nodul cu proprietățile necompletate necesare. Punctul cheie - funcția ar trebui să revină True dacă nodul a fost procesat în această funcție și fals dacă nu este procesat. Dacă nodul nu a fost procesat, va fi apelată metoda Node Start (Read XML, Node), altfel nu va fi
4. Executarea nodului de funcții (nod) Export - această funcție este pornită de fiecare dată când nodul termină procesarea. Parametrul nod conține toate informațiile necesare despre nod. Punctul cheie - funcția ar trebui să revină True dacă nodul a fost procesat în această funcție și fals dacă nu este procesat. În cazul în care nodul nu a fost procesat, metoda NodeObject (Node) va fi apelată, altfel nu va fi.
5. Procedura UzelNachalo (ChtenieXML, Node) export - această procedură este început de fiecare dată când acesta începe să fie procesată nodul cu eticheta de nume locale, cu excepția cazului în care înainte de nod nu a fost procesată de către un apel UzelNachalo (ChtenieXML, Node)
6. Procedura UzelZavershenie (Node) export - această procedură este început de fiecare dată când termină nod de procesare cu eticheta de nume locale, cu excepția cazului în care înainte de nod nu a fost procesată de către un apel UzelZavershenie (Node)
Parametrul Nod, pe lângă faptul că conține informații despre nodul curent, se referă în continuare la nodul părinte. Nodurile părinte există în timp ce toate nodurile copilului sunt procesate. Cu alte cuvinte, puteți accesa întotdeauna nodurile părinte.
În exemplul nostru, în calitate de obiect delegat, se trimite instanța curentă a procesării "Descărcați contrapărți", modulul de obiect din care arată astfel:
Rețineți că în codul dat nu există bucle sau condiții pentru compararea tipului și a denumirii nodului. În opinia mea, este citit foarte ușor.
A trebuit să precizez etichetele în paranteze pătrate, deoarece colțurile sunt "înghițite" de infostart.
Nota 3: În conformitate cu specificația XML, numele etichetei poate conține nu numai litere, cifre și un subliniere, ci și alte caractere, de exemplu "-" sau "-". În XML, de exemplu, o astfel de etichetă este [a-b.c]. Prin urmare, toate caracterele nevalide pentru identificatorul 1C sunt ignorate, de exemplu, de mai sus, eticheta va fi procesată folosind metoda Node ABC Beginning (Reading XML, Node).
Observația 5: Valoarea nodului, adică Textul care se află între etichetele de deschidere și de închidere poate fi obținut ca un nod. Valoare, dar acest lucru se poate face numai când procesarea nodului este completă, adică în metoda NodeObject (Node) sau NodeObject (Node).
În plus față de caracteristicile descrise, există cu siguranță și altele.
Sunt sigur că implementarea actuală nu este perfectă, dar nu mi-am propus o astfel de sarcină. Am vrut doar să demonstrez o abordare care mi se pare elegantă.
Dacă aveți întrebări, descărcați apoi ElegantXML.cf
Vă mulțumesc pentru atenție.
11. Andrey Ovsyankin (Beaver Evil) 4341 Joi, 08 Octombrie 194 Acum în subiect
(5) rtnm, minus bicicleta dată pentru o lectură elegantă. Dezavantajul este că această abordare este promovată în rândul comunității, în loc să încurajeze noii veniți să învețe mai puține soluții pentru biciclete.
budunovmv; alexscamp; ivon; YPermitin; astfel de normale; IvanBoychuk123; baton_pk; zqzq; DrAku1a; 1cWin; rtnm; + 11 - Răspunde
6. Alexander *** (a1ex4ndr) 08.10.14 13:11 Acum în firul
Și pe ce dimensiune a fișierului a fost testat? Și apoi în fișierul de încercare a trei linii.
7. rtnm rtnm (rtnm) 542 10/8/14 13:13 În prezent în thread
(6) a1ex4ndr, Nu este vorba despre mărimea fișierului, ci în citirea secvențială de abordare. Nu vor fi miracole, totul este comparabil cu citirea XML.
8. DUH Technolover (DJDUH) 16 08.10.14 13:46 Acum în fir
9. rtnm rtnm (rtnm) 542 08/10/14 14:01 Acum în fir
10. DaNry (DAnry) 12 08.10.14 15:38 Acum în firul
Îmi place de asemenea. A flatat.
12. Vladimir Kaznacheev (Mogidin) 123 09.10.14 13:27 Acum în subiect
aceeași citire xml, dar mult mai rapid
15. Konstantin Yurin (kostyaomsk) 72 23.10.14 10:23 Acum în fir
16. Andrey Ovsyankin (Evil Beaver) 4341 28.10.14 17:01 Acum în subiect
(12) Mogidin, Th, este foarte direct? Aveți numere?
13. Dmitry Nix (aximo) 668 Luni, 09 Octombrie 1984 19:17 În prezent în fir
Apropo, ai lucrat într-adevăr cu fișiere XML mari? Faptul este că, atunci când salvați textul de marcare la UV mai mult de 10 mb (de experiență), platforma 8.2 poate produce o eroare de salvare a fișierului.
14. rtnm rtnm (rtnm) 542 10/09/14 22:48 Currently in thread
(13) aximo, cu fișiere XML mari, împreună cu UV nu au funcționat
17. DrZombi DrZombi (DrZombi) 05.11.14 15:52 Acum în thread
ps pe DBF, puteți organiza un copac, dar este necesar;)
18. rtnm rtnm (rtnm) 542 05.11.14 17:08 Acum în firul
(17) DrZombi, data viitoare și a spune clientului: "XML-ul tău e de rahat. Dă-mi DBF, sunt mult mai confortabil cu asta" :)
19. Konstantin Yurin (kostyaomsk) 72 14.11.14 20:47 În prezent în subiect
Cel mai enervant în format DBF este lungimea câmpului de text (Mi-e teamă să fac o greșeală) 254 caractere și apoi de 1C trebuie să clei siruri de caractere sau descărcare în DBF pentru a împărți în afară. În plus, formatul DBF al ultimelor ediții poate suporta câmpul MEMO (un șir de lungime nelimitată), dar în 1C obiectul XBase nu mai există.
DBF sens să utilizeze decât fețe tip AIS paradox (FOXPRO, 1C 7.7 în modul de fișier) se generează pentru schimbul (sau încărcate în ea), sau este o sursă externă de date.
Creator0.2.10.14 09:55
Update0.2.10.14 09:55
Cod deschis Nu este listat