python - সহজ ভাষায় পাইথন ৩ pdf




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

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 বৈশিষ্ট্যতে আপনার জন্য নামস্থান সংগ্রহ করে।

আমার নিম্নলিখিত 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 ট্যাগ।


Namespaces হার্ড-কোড না করে বা তাদের জন্য পাঠ্য স্ক্যান না করে lxml এ কীভাবে করবেন তা এখানে দেখুন (মার্টিন পিটার উল্লেখ করেছেন):

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

আমি জানি, আমি কয়েক বছর দেরি করে ফেলেছি, কিন্তু আমি এমন একটি প্যাকেজ তৈরি করেছি যা একটি অভিধানকে নামস্থানগুলির সাথে বৈধ 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>

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


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

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

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

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






elementtree