[java] एसएक्स मॉडल के लिए कोई XPath प्रोसेसर है?


6 Answers

हम नियमित रूप से एक एसएक्स पार्सर का उपयोग करके 1 जीबी + जटिल एक्सएमएल फाइलों का विश्लेषण करते हैं जो आंशिक डीओएम पेड़ निकालते हैं जिन्हें आसानी से XPath का उपयोग करके पूछताछ की जा सकती है। मैंने यहां इसके बारे में ब्लॉग किया: http://softwareengineeringcorner.blogspot.com/2012/01/conveniently-processing-large-xml-files.html - स्रोत github - एमआईटी लाइसेंस पर उपलब्ध हैं।

Question

मैं एक XPath मूल्यांकनकर्ता की तलाश में हूं जो दस्तावेज़ के नोड्स को देखने के लिए पूरे डोम दस्तावेज़ का पुनर्निर्माण नहीं करता है: असल में वस्तु एसएक्स मॉडल के साथ बड़ी मात्रा में एक्सएमएल डेटा (आदर्श रूप से 2 जीबी) का प्रबंधन करना है, जो बहुत है स्मृति प्रबंधन के लिए अच्छा है, और नोड्स की खोज करने की संभावना देते हैं।

समर्थन के लिए आप सभी को धन्यवाद!

उन सभी के लिए जो कहते हैं कि यह संभव नहीं है: मैंने हाल ही में, प्रश्न पूछने के बाद, "सैक्सपाथ" ( http://www.saxpath.org/ ) नामक एक परियोजना पाई, लेकिन मुझे कोई कार्यान्वयन परियोजना नहीं मिल रही है।




मुझे नहीं लगता कि एक्सपैथ एसएक्स के साथ काम करता है, लेकिन आप स्टैक्स पर एक नज़र डाल सकते हैं जो जावा के लिए एक विस्तारित स्ट्रीमिंग एक्सएमएल एपीआई है।

http://en.wikipedia.org/wiki/StAX




सैक्सन-एसए एक्सएसएलटी-प्रोसेसर के स्ट्रीमिंग मोड पर नज़र डालें।

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

"नियम निर्धारित करते हैं कि पथ अभिव्यक्ति को स्ट्रीम किया जा सकता है या नहीं:

  • स्ट्रीम करने के लिए अभिव्यक्ति दस्तावेज़ () या दस्तावेज़ () फ़ंक्शन पर कॉल के साथ शुरू होती है।
  • दस्तावेज़ () या दस्तावेज़ पर कॉल द्वारा पेश की गई पथ अभिव्यक्ति को निम्नानुसार परिभाषित XPath के उप-समूह के अनुरूप होना चाहिए:

  • एक्सएमएल स्कीमा में पहचान बाधाओं में दिखाई देने वाले पथ अभिव्यक्तियों के नियमों के अनुरूप यह कोई XPath अभिव्यक्ति स्वीकार्य है। ये नियम भविष्यवाणी नहीं करते हैं; पहला कदम (लेकिन केवल पहला) "//" के साथ पेश किया जा सकता है; अंतिम चरण वैकल्पिक रूप से विशेषता अक्ष का उपयोग कर सकते हैं; अन्य सभी चरणों को बच्चे अक्ष का उपयोग करके सरल एक्सिस चरण होना चाहिए।

  • इसके अलावा, सैक्सन अभिव्यक्ति को एक संघ शामिल करने की अनुमति देता है, उदाहरण के लिए डॉक्टर () / (* / एबीसी | / एक्सवाईजेड)। यूनियनों को संक्षिप्त रूप में भी व्यक्त किया जा सकता है, उदाहरण के लिए उपरोक्त दस्तावेज़ () / / (एबीसी | एक्सवाईजेड) के रूप में लिखा जा सकता है
  • अभिव्यक्ति को या तो केवल तत्वों का चयन करना चाहिए, या केवल गुण, या तत्वों और विशेषताओं का मिश्रण होना चाहिए।

  • सरल फ़िल्टर (एक या अधिक) भी समर्थित हैं। प्रत्येक फ़िल्टर अंतिम चरण या अभिव्यक्ति के लिए पूरी तरह से लागू हो सकता है, और इसे केवल संदर्भ नोड (स्वयं, बच्चे, विशेषता, वंश, वंशज, या स्वयं, या नामस्थान अक्ष) से ​​नीचे की ओर चयन का उपयोग करना चाहिए। यह स्थितित्मक नहीं होना चाहिए (यानी, यह स्थिति () या अंतिम () को संदर्भित नहीं करना चाहिए, और यह संख्यात्मक नहीं होना चाहिए: असल में, ऐसा होना चाहिए कि सैक्सन संकलन समय पर निर्धारित कर सकता है कि यह संख्यात्मक नहीं होगा)। यूनियनों या यूनियनों की शाखाओं में फ़िल्टर लागू नहीं किए जा सकते हैं। इन स्थितियों का कोई उल्लंघन स्ट्रीमिंग अनुकूलन के बिना अभिव्यक्ति का मूल्यांकन करने का कारण बनता है।

  • अभिव्यक्ति पर अन्य ऑप्टिमाइज़ेशन रीराइट्स लागू होने के बाद ये नियम लागू होते हैं। उदाहरण के लिए, कुछ FLWOR अभिव्यक्तियों को पथ अभिव्यक्ति के लिए फिर से लिखा जा सकता है जो इन नियमों को पूरा करता है।

  • ऑप्टिमाइज़ेशन केवल तभी सक्षम किया जाता है जब सैक्सन: स्ट्रीम () एक्सटेंशन फ़ंक्शन, या सैक्सन का उपयोग करके स्पष्ट रूप से अनुरोध किया जाता है: anXSLT xsl पर एक बार विशेषता: प्रतिलिपि निर्देश, या XQuery प्राग्मा सैक्सन: स्ट्रीम। यह केवल तब उपलब्ध है जब स्टाइलशीट या क्वेरी सैक्सन-एसए का उपयोग करके संसाधित की जाती है। "

नोट: वाणिज्यिक सुविधा में यह सबसे अधिक संभावना है कि यह सुविधा उपलब्ध है। मैंने सैक्सन का व्यापक रूप से पहले उपयोग किया है, और यह काम का एक अच्छा टुकड़ा है।




मानक जैवैक्स xpath एपीआई तकनीकी रूप से पहले से ही धाराओं के साथ काम करता है; javax.xml.xpath.XPathExpression का मूल्यांकन एक InputSource खिलाफ किया जा सकता है, जिसे बदले में Reader साथ बनाया जा सकता है। मुझे नहीं लगता कि यह कवर के तहत एक डोम बनाता है।




मैं एएक्सएस नामक एक नई परियोजना के लिए एक प्लग में टॉस करूंगा। यह https://code.google.com/p/annotation-xpath-sax/ और विचार यह है कि आप एक्सपीथ स्टेटमेंट्स (फॉरवर्ड-अक्ष-केवल) के साथ विधियों को एनोटेट करते हैं और जब वे सैक्स पार्सर नोड पर होते हैं तो उन्हें कॉल किया जाता है जो इससे मेल खाता है। तो एक दस्तावेज़ के साथ

<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>

आप चीजें कर सकते हैं

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

या

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

या

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

बेशक, लाइब्रेरी इतनी नई है कि मैंने अभी तक इसे रिलीज़ नहीं किया है, लेकिन यह एमआईटी लाइसेंस प्राप्त है, इसलिए इसे आज़माएं और देखें कि यह आपकी ज़रूरत से मेल खाता है या नहीं। (मैंने इसे कम पर्याप्त स्मृति आवश्यकताओं के साथ एचटीएमएल स्क्रीन-स्क्रैपिंग करने के लिए लिखा है जिसे मैं इसे पुराने एंड्रॉइड डिवाइस पर चला सकता हूं ...) यदि आपको बग मिलती हैं, तो कृपया मुझे googlecode साइट पर दर्ज करके मुझे बताएं!




एसएक्स केवल अग्रेषित है, जबकि XPath प्रश्न किसी भी दिशा में दस्तावेज़ को नेविगेट कर सकते हैं ( parent:: ancestor:: , preceding:: और preceding-sibling:: अक्ष पर विचार करें)। मैं नहीं देखता कि यह सामान्य रूप से कैसे संभव होगा। सबसे अच्छा अनुमान कुछ प्रकार के आलसी लोडिंग डीओएम होगा, लेकिन आपके प्रश्नों के आधार पर यह आपको कोई लाभ नहीं दे सकता है या नहीं - हमेशा एक सबसे खराब केस क्वेरी है जैसे कि //*[. != preceding::*] //*[. != preceding::*]




SAX / StAX आधारित XPath कार्यान्वयन हैं, लेकिन वे केवल एसएएक्स / एसएक्सएक्स की अग्रेषित प्रकृति के कारण एक्सपीएथ एक्सप्रेशन / अक्ष के एक छोटे से सबसेट का समर्थन करते हैं .. सबसे अच्छा विकल्प मुझे पता है कि वीटीडी-एक्सएमएल विस्तारित है, यह पूर्ण xpath का समर्थन करता है, मेम-मैप के माध्यम से आंशिक दस्तावेज़ लोडिंग .. और 256 जीबी का अधिकतम दस्तावेज़ आकार, लेकिन इसे 64-बिट जेवीएम की पूरी क्षमता के लिए उपयोग करने की आवश्यकता होगी




Related