Strona 1 z 1

Odczytywanie znakow w odt. uzywajac c++

: wt cze 14, 2011 11:07 am
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

Re: Odczytywanie znakow w odt. uzywajac c++

: wt cze 14, 2011 2:47 pm
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.

Re: Odczytywanie znakow w odt. uzywajac c++

: wt cze 14, 2011 3:42 pm
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.

Re: Odczytywanie znakow w odt. uzywajac c++

: wt cze 14, 2011 5:18 pm
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.

Re: Odczytywanie znakow w odt. uzywajac c++

: czw cze 16, 2011 10:53 pm
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.

Re: Odczytywanie znakow w odt. uzywajac c++

: sob cze 18, 2011 1:13 pm
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.

Re: Odczytywanie znakow w odt. uzywajac c++

: wt cze 21, 2011 3:25 pm
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,"