python সহজ 'ElementTree' এর মাধ্যমে পাইথনে নামস্থান সহ এক্সএমএল পার্স করা হচ্ছে




সহজ ভাষায় পাইথন ৩ pdf (5)

আমি জানি, আমি কয়েক বছর দেরি করে ফেলেছি, কিন্তু আমি এমন একটি প্যাকেজ তৈরি করেছি যা একটি অভিধানকে নামস্থানগুলির সাথে বৈধ XML এ রূপান্তরিত করবে। প্যাকেজটি PyPi @ https://pypi.python.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>

এই ভবিষ্যতে মানুষের জন্য দরকারী আশা করি

আমার নিম্নলিখিত 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 তাদের ভিতরে 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 এ দস্তাবেজটি পড়ার চেষ্টা করেছি কিন্তু আমি এখনও এই কাজটি পেতে সক্ষম নই কারণ উপরের XML এ একাধিক নেস্টেড নামস্থান রয়েছে।

দয়া করে আমাকে সমস্ত owl:Class কোডটি কীভাবে পরিবর্তন করতে হবে তা জানতে দিন owl:Class ট্যাগ।


আমি এইরকম কোড ব্যবহার করছি এবং ডকুমেন্টেশন পড়ার জন্য সর্বদা মূল্যবান!

findall () শুধুমাত্র বর্তমান ট্যাগ সরাসরি সন্তান যারা উপাদান খুঁজে পাবেন। তাই, সত্যিই সব না।

আপনার কোডটি নিম্নলিখিতগুলির সাথে কাজ করার চেষ্টা করার সময় আপনার পক্ষে মূল্যবান হতে পারে, বিশেষ করে যদি আপনি বড় এবং জটিল XML ফাইলগুলির সাথে ডিল করছেন তবে উপ-উপ-উপাদানের (ইত্যাদি) অন্তর্ভুক্ত রয়েছে। যদি আপনি নিজের xml এ উপাদানগুলিকে কোথায় জানেন তবে আমি মনে করি এটি ভাল হবে! শুধু মনে রাখা এই মূল্য ছিল।

root.iter()

রেফারেন্স: https://docs.python.org/3/library/xml.etree.elementtree.html#finding-interesting-elements -elements "Element.findall () বর্তমান ট্যাগের সরাসরি সন্তানদের ট্যাগের সাথে শুধুমাত্র উপাদানগুলি খুঁজে পায়। Element.find () একটি বিশেষ ট্যাগ সহ প্রথম সন্তানের সন্ধান করে এবং Element.text উপাদানটির পাঠ্য সামগ্রী অ্যাক্সেস করে। Element.get () উপাদানটির গুণাবলীগুলি অ্যাক্সেস করে: "


ElementTree নামস্থান সম্পর্কে খুব স্মার্ট নয়। আপনাকে .find() , findall() এবং iterfind() একটি স্পষ্ট নামস্থান অভিধান। এটি খুব ভাল নথিভুক্ত করা হয় না:

namespaces = {'owl': 'http://www.w3.org/2002/07/owl#'} # add more as needed

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

প্রিফিক্সগুলি শুধুমাত্র আপনি যে নামপাসেস প্যারামিটারটি পাস করেছেন তার মধ্যেই দেখানো হয়। এর অর্থ আপনি যে কোনও নেপাস্পেস উপসর্গ ব্যবহার করতে পারেন; API এ owl: অংশটি বিভক্ত করে owl: অংশ, namespaces অভিধানে সংশ্লিষ্ট নামস্পেস URL দেখায়, তারপরে XPath অভিব্যক্তি {http://www.w3.org/2002/07/owl}Class পরিবর্তে অনুসন্ধানের জন্য অনুসন্ধানটি পরিবর্তন করে। অবশ্যই আপনি একই সিনট্যাক্স অবশ্যই ব্যবহার করতে পারেন:

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

আপনি যদি lxml লাইব্রেরি জিনিস পরিবর্তন করতে পারেন ভাল; যে লাইব্রেরিটি একই ElementTree API সমর্থন করে তবে উপাদানগুলিতে একটি .nsmap বৈশিষ্ট্যতে আপনার জন্য নামস্থান সংগ্রহ করে।


দ্রষ্টব্য : হার্ডডোডেড নামস্থানগুলি ব্যবহার না করে এটি পাইথনের এলিমেন্টTree স্ট্যান্ডার্ড লাইব্রেরির জন্য একটি উত্তর।

এক্সএমএল ডেটা থেকে নামস্থান এর উপসর্গ এবং URI বের করতে আপনি কেবলমাত্র ElementTree.iterparse শুরুর ইভেন্টগুলি ( স্টার্ট-এনএস ) বিশ্লেষণ করে, ElementTree.iterparse ফাংশন ব্যবহার করতে পারেন:

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

{myNameSpace} ফর্ম্যাট পেতে, যেমন {myNameSpace} , আপনি নিম্নলিখিতগুলি করতে পারেন:

root = tree.getroot()
ns = re.match(r'{.*}', root.tag).group(0)

এই ভাবে, আপনি নোড খুঁজতে আপনার কোডে পরে এটি ব্যবহার করতে পারেন, যেমন স্ট্রিং ইন্টারপোলেশন (পাইথন 3) ব্যবহার করে।

link = root.find(f'{ns}link')






elementtree