it-swarm.dev

Existuje nějaký XPath procesor pro SAX model?

Hledám hodnotitele XPath, který nepřepravuje celý dokument DOM, aby hledal uzly dokumentu: objektem je vlastně správa velkého množství dat XML (ideálně přes 2Gb) s modelem SAX, což je velmi dobré pro správu paměti a dát možnost vyhledávat uzly.

Děkuji vám všem za podporu!

Pro všechny, kteří říkají, že to není možné: Nedávno jsem po položení otázky našel projekt nazvaný "saxpath" ( http://www.saxpath.org/ ), ale nemohu najít žádný realizační projekt .

55
user189603

Můj aktuální seznam (zkompilovaný z výsledků webového vyhledávání a další odpovědi) je:

Dalším krokem je použití příkladů XMLDog a porovnání výkonu všech těchto přístupů. Pak by měly být testovací případy rozšířeny na podporované výrazy XPath.

15
koppor

Pravidelně analyzujeme 1GB + komplexní XML soubory pomocí analyzátoru SAX, který extrahuje částečné DOM stromy, které lze pohodlně dotazovat pomocí XPath. O tom jsem blogoval: http://softwareengineeringcorner.blogspot.com/2012/01/convenience-processing-large-xml-files.html - Zdroje jsou dostupné na github - MIT Licence.

11
Andreas Haufler

XPath spolupracuje s SAX a většina XSLT procesorů (zejména Saxon a Apache Xalan) podporuje provádění výrazů XPath uvnitř XSLT na stream SAX bez budování celého dom.

To se jim daří, zhruba takto:

  1. Prozkoumání výrazů XPath, které musí odpovídat
  2. Příjem SAX událostí a testování, pokud je tento uzel potřebný nebo bude potřebný jedním z výrazů XPath.
  3. Ignorování události SAX, pokud není použito pro výrazy XPath.
  4. Pokud je to nutné, ukládejte do vyrovnávací paměti

Jak je to buffer je také velmi zajímavé, protože zatímco někteří jednoduše vytvářejí DOM fragmenty tady a tam, jiní používají velmi optimalizované tabulky pro rychlé vyhledávání a snížení spotřeby paměti.

Do jaké míry se jim daří optimalizovat do značné míry závisí na druhu dotazů, které XPath naleznou. Jak již jasně vysvětluje již zveřejněná saská dokumentace, dotazy, které se pohybují „nahoru“ a pak „horizontálně“ (sourozenci sourozenci), dokument zjevně vyžaduje, aby tam byl celý dokument, ale většina z nich vyžaduje jen několik uzlů, které mají být uchovávány RAM.

Jsem si tím docela jistý, protože když jsem dělal každý den webovou stránku s použitím Cocoonu, měli jsme problém s paměťovou stopou XSLT pokaždé, když jsme v XSLT použili výraz "// něco" a často jsme museli přepracovat výrazy XPath umožnit lepší optimalizaci SAX.

9
Simone Gianni

SAX je pouze dopředu, zatímco dotazy XPath mohou procházet dokumentem v libovolném směru (uvažujte parent::, ancestor::, preceding:: a preceding-sibling:: osa). Nevidím, jak by to bylo obecně možné. Nejlepším přiblížením by byl nějaký DOM, který je jen líný, ale v závislosti na vašich dotazech vám může nebo nemusí poskytnout žádnou výhodu - vždy existuje nejhorší případ, například dotaz //*[. != preceding::*].

6
Pavel Minaev

Je nám líto, poněkud pozdní odpověď zde - zdá se, že je to možné pro podmnožinu XPath - obecně je to velmi obtížné vzhledem k tomu, že XPath se může shodovat jak dopředu, tak dozadu od "aktuálního" bodu. Jsem si vědoma dvou projektů, které to do jisté míry řeší pomocí státních počítačů: http://spex.sourceforge.net & http://www.cs.umd.edu/projects/xsq . Nedívala jsem se na ně podrobně, ale zdá se, že používají podobný přístup.

4
Colin

Hodím do zástrčky pro nový můj projekt, zvaný AXS. Je to na adrese https://code.google.com/p/annotation-xpath-sax/ a myšlenka je, že budete komentovat metody pomocí příkazů XPath S dopřednou osou zavolá, když je analyzátor SAX v uzlu, který jej odpovídá. Takže s dokumentem

<doc>
<nodes>
  <node name="a">text of node 1</node>
  <node name="b">text of node 2</node>
  <node otherattr="I have attributes!">text of node 3</node>
</nodes>
</doc>

můžete dělat věci jako

@XPath("/nodes/node")
void onNode(String nodeText)
{
  // will be called with "text of node [123]"
}

nebo

@XPathStart("//node[@name='']")
void onNode3(Attrs node3Attrs) { ... }

nebo

@XPathEnd("/nodes/node[2]")
void iDontCareAboutNode3() throws SAXExpression
{
  throw new StopParsingExpression();
}

Knihovna je samozřejmě tak nová, že jsem ji ještě nevydala, ale je to MIT licencovaná, takže si ji můžete vyzkoušet a zjistit, zda odpovídá vaší potřebě. (Napsal jsem to do Do HTML scrapingu s nízkými nároky na paměť, kterou můžu spustit na Starých zařízeních se systémem Android ...) Pokud najdete chyby, dejte mi prosím vědět jejich podáním na stránkách googlecode!

3
bks

Omlouváme se za pozdní odpověď, ale implementoval jednoduchý XPath výraz cesta pro analyzátory SAX. Podporuje pouze tag, atribut s volitelnou hodnotou a index díky dopředné povaze SAX. Udělal jsem delegát Handler pro vyhodnocení daného výrazu, když Handler implementuje ExpressionFilter . I když jsou tyto třídy začleněny do projektu, nemělo by být těžké je extrahovat.

Více informací

Příklady - Viz třídy s předponou HandlerHtml

2
Kyle Kroboth

Existují implementace XPath založené na SAX/StAX, ale podporují pouze malou podmnožinu výrazů/os XPath, převážně díky dopředné povaze SAX/StAX. Nejlepší alternativa, kterou znám, je rozšířena VTD-XML , it podporuje plnou xpath, částečné načítání dokumentů přes mem-map .. a maximální velikost dokumentu 256GB, ale budete potřebovat 64-bitový JVM pro jeho plné využití

2
vtd-xml-author

Co byste mohli udělat, je zavěsit transformátor XSL do vstupního zdroje SAX. Vaše zpracování bude sekvenční a preprocesor XSL se pokusí zachytit vstup, jakmile se dostane do jakéhokoliv výsledku, který jste zadali. To lze použít k vytáhnutí hodnoty cesty z proudu. To by bylo obzvláště užitečné, kdybyste chtěli vyrobit spoustu různých výsledků XPATH v jednom průchodu.

Výsledkem je (typicky) dokument XML, ale můžete očekávaný výstup vytáhnout z, řekněme, StreamResult s nepříliš velkými problémy.

1
Carl Smotricz

Podívejte se na režim streamování procesoru Saxon-SA XSLT.

http://www.saxonica.com/documentation/sourcedocs/serial.html

"Pravidla, která určují, zda lze výraz cesty streamovat, jsou:

  • Výraz, který má být streamován, začíná voláním funkce document () nebo doc ().
  • Výraz cesty zavedený voláním doc () nebo dokumentu musí odpovídat podmnožině XPath definované takto:

  • jakýkoli výraz XPath je přijatelný, pokud vyhovuje pravidlům pro výrazy cest, které se objevují v omezeních identity ve schématu XML. Tato pravidla neumožňují žádné predikáty; první krok (ale jen první) může být zaveden s "//"; posledním krokem může být volitelně osa atributu; všechny ostatní kroky musí být jednoduché Kroky osy pomocí osy dítěte.

  • Saxon navíc umožňuje, aby výraz obsahoval spojení, například doc ()/(*/ABC | / XYZ). Odbory mohou být také vyjádřeny ve zkrácené formě, například výše může být napsána jako doc ()//(ABC | XYZ).
  • Výraz musí buď vybrat pouze prvky, nebo pouze atributy, nebo směs prvků a atributů.

  • Podporovány jsou také jednoduché filtry (jeden nebo více). Každý filtr se může vztahovat na poslední krok nebo na výraz jako celek a musí používat pouze sestupný výběr z kontextového uzlu (osy self, child, attribute, descendant, descendant-or-self nebo namespace). Nesmí být poziční (to znamená, že nesmí odkazovat na pozici () nebo na poslední (), a nesmí být číselný: ve skutečnosti musí být takový, že Saxon může při kompilačním čase určit, že nebude číselný). Filtry nelze aplikovat na odbory nebo na pobočky odborů. Jakékoli porušení těchto podmínek způsobí, že výraz bude vyhodnocen bez optimalizace streamování.

  • Tato pravidla platí po použití dalších optimalizačních přepisů na výraz. Některé výrazy FLWOR mohou být například přepsány na výraz cesty, který splňuje tato pravidla.

  • Optimalizace je povolena pouze v případě, že je to výslovně požadováno, a to buď pomocí funkce rozšíření saxon: stream (), nebo atributu saxon: read-once na adrese xXlLT: copy-of instruction nebo XQuery pragma saxon: stream. Je k dispozici pouze v případě, že je šablona stylů nebo dotaz zpracován pomocí Saxon-SA.

Poznámka: Je to s největší pravděpodobností v komerční verzi tohoto zařízení je k dispozici. Sasko jsem používal značně dříve a je to pěkná práce.

Mmh Nevím, jestli ti opravdu rozumím. Pokud vím, model SAX je orientován na události. To znamená, že uděláte něco, pokud se během analýzy vyskytne určitý uzel. Jo, je to lepší pro paměť, ale nevidím, jak bys do ní chtěl dostat XPath. Protože SAX nevytváří model, nemyslím si, že je to možné.

0
Felix Kling

Standardní javax xpath API technicky již pracuje se streamy; javax.xml.xpath.XPathExpression lze vyhodnotit proti InputSource, který může být sestaven s Reader. Nemyslím si, že to pod domem staví DOM.

0
skaffman

Vyzkoušeli jste také QuiXPath https://code.google.com/p/quixpath/ ?

0
innovimax