Odczytywanie znakow w odt. uzywajac c++

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
Wojtek
Posty: 4
Rejestracja: wt cze 14, 2011 10:07 am

Odczytywanie znakow w odt. uzywajac c++

Post autor: Wojtek »

Witam

Mam male zagadnienie ktore po krotce przestawie nastepujaco. Probuje napisac program ktory odczytuje format .odt (Writer'a) liczac: slowa, znaki i znaki bez spacji w c++.
"Przeczytalem" 860 stonicowa dokumentacje w ktorej byla opisana funkcjonalnosci aplikacji OO poprzez opisanie tagow w ktorej nie znalazlem interesujach mnie informacji wiec prosze o pomoc badz linki.

Dziekuje
OpenOffice 3.3 na Windows 7
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Odczytywanie znakow w odt. uzywajac c++

Post autor: Jan_J »

Musisz wziąć pod uwagę, że
  • plik ODF jest zip-em zawierającym inne pliki,
  • dane w tych plikach są zapisane jawnym tekstem (chyba że coś szyfrujemy),
  • w tekście tym są używane znaczniki XML.
Nie różni się to wiele od analizy plików XHTML, a nawet zwykłego tekstu.

W każdym razie wszystko co jest pomiędzy < i najbliższym > możesz pomijać. Wszystko co jest pomiędzy & i najbliższym ; musisz zastąpić odpowiednią treścią. Reszta to jest czysty tekst. (XML ma jeszcze kilka innych reguł, np. dot. komentarzy i danych nie podlegających analizie, ale w typowym content.xml raczej się na nie nie natkniesz.)

Zależnie od stopnia zaawansowania i potrzeb dobierz optymalny dla siebie poziom działania:
  • interpretacja danych (np. "znacznik", "spacja") odczytywanych ze strumienia wejściowego -- analiza w miarę odczytywania danych,
  • czytanie tekstu niesformatowanego o swobodnym dostępie (czytaj całość jako tekst, potem przekształcaj i analizuj),
  • wyrażenia regularne,
  • interfejs do XML, np. SAX.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Wojtek
Posty: 4
Rejestracja: wt cze 14, 2011 10:07 am

Re: Odczytywanie znakow w odt. uzywajac c++

Post autor: Wojtek »

Tak owszem rozpakowujac plik .odt i analizujac poszczegolne pliki zauwazylem iz plik o nazwie content.xml zawiera zawartosc jak sama nazwa mowi ktory wyglada nastepujaco(a reczej jego istotna czesc zawierajaca text ktory wprowadzilem do .odt writer'a):

"Drawing"/></text:sequence-decls><text:p text:style-name="P1">text</text:p><text:p text:style-name="P1"/><text:p text:style-name="P1"/><text:p text:style-name="P2">text</text:p></office:text></office:body></office:document-content>

Gdzie podwojnie wprowadzilem slowo "text" lecz drugi w "boldzie" aby zanalizowac formatowanie textu przez tagi. Mysle ze Simple API XML czyli parsowanie dokumentu xml (jesli dobrze zrozumialem) bedzie najlepszym rozwiazaniem. Ale jakby to dokladnie wygladalo bo nie umialem sie doszukac dokladniejszych przykladow niz te na wikipedii.
OpenOffice 3.3 na Windows 7
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Odczytywanie znakow w odt. uzywajac c++

Post autor: Jan_J »

SAX czytając strumień znaków generuje zdarzenia związane ze zmianą stanu czytnika (rozpoczęcie/zakończenie elementu XML, jednostka XML, dane znakowe). Obsługa zdarzeń musi być opisana w funkcjach dostarczanych przez użytkownika.

Wygooglanie nietrywialnego przykładu użycia SAX w C++ nie powinno być problemem.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Wojtek
Posty: 4
Rejestracja: wt cze 14, 2011 10:07 am

Re: Odczytywanie znakow w odt. uzywajac c++

Post autor: Wojtek »

Chcac osiagnac zamierzone funkcje musze uzyc jednego z parserow xml'owskich w jezyku c++ jak wczesniej wspomnialem lecz chcialbym porade dotyczaca ktorego i dlaczego z tych dostepnych: http://lars.ruoff.free.fr/xmlcpp/ bo jednak doczytalem sie sprzecznych opnini tak co do jakosci jak i funkcjonalnosci oraz platform na ktorych "podobno" (nie) dzialaja.

Nizej przedstawie sklad dwoch wartosci ktore mnie interesuja z pliku meta.xml

ilosc slow: meta:word-count="4" <----------------- chce wyciagnac wartosc "4" zamiast liczyc slowa "maualnie" w c++

ilosc znakow: meta:character-count="34" <----------||--------- "34"--------------||------------------------------------------

Gdzie 34 to wartosc znakow ze spacjami wiec musze obliczyc same spacje ktore beda wartoscia trzecia ktora chce osiagnac czyli (znaki-spacje = "same"znaki(bez bialych))
z:

content.xml

Kod: Zaznacz cały

<?xml version="1.0" encoding="UTF-8"?>
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" office:version="1.2" grddl:transformation="http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl"><office:scripts/><office:font-face-decls><style:font-face style:name="Mangal1" svg:font-family="Mangal"/><style:font-face style:name="Times New Roman" svg:font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/><style:font-face style:name="Mangal" svg:font-family="Mangal" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="Microsoft YaHei" svg:font-family="&apos;Microsoft YaHei&apos;" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="SimSun" svg:font-family="SimSun" style:font-family-generic="system" style:font-pitch="variable"/></office:font-face-decls><office:automatic-styles><style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard"><style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/></style:style><style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard"><style:text-properties fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/></style:style></office:automatic-styles><office:body><office:text><text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls><text:p text:style-name="P1">[b]wojciech smietana[/b]</text:p><text:p text:style-name="P1"/><text:p text:style-name="P1"/><text:p text:style-name="P2">[b]wojciech smietana[/b]</text:p></office:text></office:body></office:document-content>
Tutoriali jest pelno lecz nie natrafilem na takie ktore odpowiadalyby na moje pytania a jesli to wspomagaja inne jezyki programowania badz szeroka implementacje skyptow.
Ostatnio zmieniony sob cze 18, 2011 2:24 pm przez quest-88, łącznie zmieniany 1 raz.
Powód: Dodanie BBCode
OpenOffice 3.3 na Windows 7
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Odczytywanie znakow w odt. uzywajac c++

Post autor: Jan_J »

Tak jak mówiłem, nie jestem ekspertem od SAX. Jest mało prawdopodobne, by na to forum jakiś ekspert zaglądał. Dlatego lepiej jest szukać pomocy gdzie indziej, np. na grupach dyskusyjnych SAX-a.
Użyłem kilka razy w życiu libxml2 i expat-a, jest to kawał porządnego softu. O innych niewiele mogę powiedzieć, ale to nic nie znaczy.

Tak w ogóle, jeżeli spojrzeć na Twoje zadanie, to nie potrzeba aż tak silnych narzędzi. Przy odrobinie ostrożności da się wyłuskać tekst za pomocą wyrażeń regularnych pomijających znaczniki. Ostrożność polegałaby na tym, że by nie skleić ze sobą odrębnych słów leżących na granicy kontenerów XML, bo w OpenDocument nie ma w takich miejscach spacji. Trzeba po prostu wiedzieć, które elementy formują blok, a które są inline. Ten sam problem wystąpi zresztą przy korzystaniu z parserów XML.

Także gdyby chcieć skorzystać z pól metainformacyjnych zapisanych w dokumencie, dałoby się to zrobić przez wyrażenia regularne. Z tym, że pola te zawierają wtórną, przetworzoną informację, w związku z czym nie polegałbym na niej zbytnio. Pół biedy, jeżeli dokument był tworzony przez OOo czy LibO, ale przecież XML-a wygenerować się da czymkolwiek, i to cokolwiek nie udziela gwarancji na zliczanie statystyk. Czy zaś statystyki są obowiązkowym, czy dopuszczalnym elementem dokumentu -- to by trzeba sprawdzić w definicji standardu. Na pamięć nie wiem.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Wojtek
Posty: 4
Rejestracja: wt cze 14, 2011 10:07 am

Re: Odczytywanie znakow w odt. uzywajac c++

Post autor: Wojtek »

A czy analiza odczytywanych danych i proba odczytania UTF8 jest mozliwa zamiast uzywac za skomplikowanych dla mnie narzedzi typu SAX ? Mysle ze rozwiazania o ktorych pan wspominal bylyby latwiejsze. Czy mam racje ?

"interpretacja danych (np. "znacznik", "spacja") odczytywanych ze strumienia wejściowego
analiza w miarę odczytywania danych,
czytanie tekstu niesformatowanego o swobodnym dostępie (czytaj całość jako tekst, potem przekształcaj i analizuj),
wyrażenia regularne,"
OpenOffice 3.3 na Windows 7
ODPOWIEDZ