दिलचस्प पोस्ट
पायथन में पीएनजी को एसवीजी कन्वर्ट करें scanf का उपयोग करते हुए विभाजन गलती एसक्यूएल में कुशलता से एक स्तंभ मूल्य की घटनाओं को कैसे गिनें? ग्रेडः https: //..pom> पीएर नहीं प्रमाणित किया जा सका स्प्रिंग एमवीसी: रिसेप्शनबॉडी में छवि कैसे लौटाएगी? जावास्क्रिप्ट का प्रयोग करते हुए ब्राउज़र मौजूदा लोकेल प्राथमिकता प्राप्त करने के लिए कैसे? एक UITableView सेल में UISwitch Os.name, sys.platform, या platform.system का उपयोग कब करना है? "रिक्त या शून्य मान" की जांच करने का सर्वोत्तम तरीका पोस्टग्रेज़: तालिका को विदेशी कुंजी में सूचीबद्ध करने के लिए SQL कोणीय 2 एप बूटस्ट्रैप करते हुए एक एपीआई कॉल करने के लिए कैसे करें वापसी प्रकार का असाइनमेंट ऑपरेटर क्या है? सभी दृश्यों के लिए टच ईवेंट को अक्षम करें PHPMyAdmin में फ़ाइल आकार सीमा आयात करें उल्का ऐप्स ऑफ़लाइन कैसे काम कर सकते हैं?

'एलीमेंटट्री' के माध्यम से पायथन में नेमस्पेस के साथ XML को पार्स करना

मेरे पास निम्न XML है, जिसे मैं पायथन ElementTree का इस्तेमाल करना चाहता हूं:

 <rdf:RDF xml:base="http://dbpedia.org/ontology/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns="http://dbpedia.org/ontology/"> <owl:Class rdf:about="http://dbpedia.org/ontology/BasketballLeague"> <rdfs:label xml:lang="en">basketball league</rdfs:label> <rdfs:comment xml:lang="en"> a group of sports teams that compete against each other in Basketball </rdfs:comment> </owl:Class> </rdf:RDF> 

मैं सभी owl:Class को खोजना चाहता हूं owl:Class टैग और उसके बाद सभी rdfs:label उनके अंदर rdfs:label उदाहरण। मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

 tree = ET.parse("filename") root = tree.getroot() root.findall('owl:Class') 

नामस्थान के कारण, मुझे निम्नलिखित त्रुटि मिल रही है

 SyntaxError: prefix 'owl' not found in prefix map 

मैंने http://effbot.org/zone/element-namespaces.htm पर दस्तावेज़ पढ़ने की कोशिश की लेकिन मैं अभी भी यह काम नहीं कर पा रहा हूं क्योंकि उपरोक्त एक्सएमएल में कई नेस्टेड नामस्थान हैं

कृपया मुझे पता है कि सभी owl:Class को खोजने के लिए कोड को कैसे बदलना है owl:Class टैग्स

Solutions Collecting From Web of "'एलीमेंटट्री' के माध्यम से पायथन में नेमस्पेस के साथ XML को पार्स करना"

एलीमेंटट्री नाम स्थान के बारे में बहुत स्मार्ट नहीं है। आपको। .find() , iterfind() और iterfind() विधियां एक स्पष्ट नेमस्पेस शब्दकोश प्रदान करने की आवश्यकता है। यह बहुत अच्छी तरह से प्रलेखित नहीं है:

 namespaces = {'owl': 'http://www.w3.org/2002/07/owl#'} # add more as needed root.findall('owl:Class', namespaces) 

उपसर्गों को केवल नामपैस पैरामीटर में देखा जाता है जो आप पास करते हैं। इसका अर्थ है कि आप अपनी पसंद के किसी भी नेम-स्पेस उपसर्ग का उपयोग कर सकते हैं; एपीआई owl: से अलग हो जाती है owl: भाग, namespaces शब्दकोश में संबंधित नेमस्पेस यूआरएल को दिखता है, फिर इसके बजाय एक्सपाथ अभिव्यक्ति {http://www.w3.org/2002/07/owl}Class लिए खोज करने के लिए खोज बदल जाती है। आप खुद को उसी वाक्य रचना का उपयोग कर सकते हैं:

 root.findall('{http://www.w3.org/2002/07/owl#}Class') 

अगर आप lxml लाइब्रेरी की चीजें बदल सकते हैं तो बेहतर है; वह लाइब्रेरी एक ही एलीमेंटट्री एपीआई का समर्थन करता है, लेकिन तत्वों पर एक। .nsmap विशेषता में आपके लिए नामस्थान इकट्ठा करता है।

ऐसा कैसे करें कि यह लिसाक्स के साथ कड़ी मेहनत के नामों के बिना या पाठ को स्कैन करने के लिए बिना (मार्टिजन पीटर के रूप में उल्लेख किया गया है):

 from lxml import etree tree = etree.parse("filename") root = tree.getroot() root.findall('owl:Class', root.nsmap) 

नोट : यह एक पायथन की एलीमेंटट्री मानक लाइब्रेरी के लिए उपयोगी है, जो हार्डकॉडेड नामस्थानों का उपयोग किए बिना।

एक्सएमएल डेटा से नेमस्पेस के उपसर्गों और यूआरआर को निकालने के लिए आप ElementTree.iterparse फंक्शन का उपयोग कर सकते हैं, केवल नेमस्पेस प्रारंभ करने वाले ईवेंट ( शुरू- ns ) पार्स करते हुए:

 >>> from io import StringIO >>> from xml.etree import ElementTree >>> my_schema = u'''<rdf:RDF xml:base="http://dbpedia.org/ontology/" ... xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ... xmlns:owl="http://www.w3.org/2002/07/owl#" ... xmlns:xsd="http://www.w3.org/2001/XMLSchema#" ... xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" ... xmlns="http://dbpedia.org/ontology/"> ... ... <owl:Class rdf:about="http://dbpedia.org/ontology/BasketballLeague"> ... <rdfs:label xml:lang="en">basketball league</rdfs:label> ... <rdfs:comment xml:lang="en"> ... a group of sports teams that compete against each other ... in Basketball ... </rdfs:comment> ... </owl:Class> ... ... </rdf:RDF>''' >>> my_namespaces = dict([ ... node for _, node in ElementTree.iterparse( ... StringIO(my_schema), events=['start-ns'] ... ) ... ]) >>> from pprint import pprint >>> pprint(my_namespaces) {'': 'http://dbpedia.org/ontology/', 'owl': 'http://www.w3.org/2002/07/owl#', 'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdfs': 'http://www.w3.org/2000/01/rdf-schema#', 'xsd': 'http://www.w3.org/2001/XMLSchema#'} 

तब शब्दकोश को खोज कार्यों के तर्क के रूप में पारित किया जा सकता है:

 root.findall('owl:Class', my_namespaces) 

मैं इसके लिए समान कोड का उपयोग कर रहा हूं और पाया है कि यह हमेशा दस्तावेज पढ़ना लायक है … हमेशा की तरह!

Findall () केवल ऐसे तत्व पाएंगे जो वर्तमान टैग के प्रत्यक्ष बच्चों हैं तो, वास्तव में सभी नहीं

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

 root.iter() 

रेफरी: https://docs.python.org/3/library/xml.etree.elementtree.html#finding-interesting-elements "Element.findall () केवल एक तत्व के साथ तत्व खोजता है जो वर्तमान तत्व के प्रत्यक्ष बच्चों हैं। Element.find () एक विशेष टैग के साथ पहला बच्चा पाता है, और Element.text तत्व की पाठ सामग्री तक पहुंचता है Element.get () तत्व के गुणों को एक्सेस करता है: "

मुझे पता है कि मैं कुछ वर्षों के अंत तक हूं, लेकिन मैंने एक पैकेज बनाया जो एक शब्दकोश को नामजदों के साथ वैध XML में परिवर्तित कर देगा। पैकेज को पीपीआई पर होस्ट किया गया है @ https://pypi.pythth.org/pypi/xmler

इस पैकेज का उपयोग करके आप ऐसे शब्दकोश ले सकते हैं जो इस तरह दिखता है:

 myDict = { "RootTag": { # The root tag. Will not necessarily be root. (see #customRoot) "@ns": "soapenv", # The namespace for the RootTag. The RootTag will appear as <soapenv:RootTag ...> "@attrs": { # @attrs takes a dictionary. each key-value pair will become an attribute { "xmlns:soapenv": "http://schemas.xmlsoap.org/soap/envelope/" } }, "childTag": { "@attrs": { "someAttribute": "colors are nice" }, "grandchild": "This is a text tag" } } } 

और एक्सएमएल आउटपुट प्राप्त करें जो इस तरह दिखता है:

 <soapenv:RootTag xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <childTag someAttribute="colors are nice"> <grandchild>This is a text tag</grandchild> </childTag> </soapenv:RootTag> 

आशा है कि भविष्य में लोगों के लिए यह उपयोगी है