পাইথনে আমি কীভাবে এক্সএমএলকে পার্স করব?


1001

আমার কাছে একটি ডাটাবেসে অনেকগুলি সারি রয়েছে যাতে এক্সএমএল থাকে এবং আমি একটি নির্দিষ্ট নোড বৈশিষ্ট্যের উদাহরণ গণনা করার জন্য পাইথন স্ক্রিপ্ট লেখার চেষ্টা করছি।

আমার গাছটি দেখতে দেখতে:

<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>

আমি কীভাবে বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারি "1""2"পাইথন ব্যবহার করে এবং এক্সএমএলে ?


উত্তর:


780

আমার পরামর্শ ElementTree। একই এপিআই এর মতো অন্যান্য সুসংগত বাস্তবায়ন রয়েছে lxml, এবং cElementTreeপাইথন স্ট্যান্ডার্ড লাইব্রেরিতে নিজেই; তবে, এই প্রসঙ্গে, তারা প্রধানত যা যুক্ত করে তা আরও বেশি গতিযুক্ত - প্রোগ্রামিং অংশের স্বাচ্ছন্দতা এপিআই-র উপর নির্ভর করে যা ElementTreeসংজ্ঞায়িত করে।

প্রথমে rootএক্সএমএল থেকে একটি এলিমেন্ট উদাহরণ তৈরি করুন , উদাহরণস্বরূপ এক্সএমএল ফাংশন সহ, বা এর মতো কিছু দিয়ে একটি ফাইল পার্স করে:

import xml.etree.ElementTree as ET
root = ET.parse('thefile.xml').getroot()

অথবা দেখানো অনেক অন্যান্য উপায়ে কোন ElementTree। তারপরে এমন কিছু করুন:

for type_tag in root.findall('bar/type'):
    value = type_tag.get('foobar')
    print(value)

এবং অনুরূপ, সাধারণত বেশ সহজ, কোড নিদর্শন।


41
আপনি xML.etree.cElementTree এড়িয়ে যাবেন যা পাইথনের সাথে আসে এবং কিছু দিক থেকে দ্রুত থম এলএক্সএমএল হয় ("এলএক্সএমএল এর ইটারপার্স () সিইটি-র তুলনায় কিছুটা ধীর" - lxML লেখকের ই-মেইল)।
জন মাচিন

7
এলিমেন্টটি কাজ করে এবং পাইথনের সাথে অন্তর্ভুক্ত। যদিও এক্সপ্যাথের সীমিত সমর্থন রয়েছে এবং আপনি কোনও উপাদানটির পিতামাতার কাছে যেতে পারেন না, যা বিকাশকে কমিয়ে দিতে পারে (বিশেষত যদি আপনি এটি জানেন না)। দেখুন পাইথন XML পিতা বা মাতা পেতে QUERY বিস্তারিত জানার জন্য।
স্যামুয়েল

11
lxmlগতির চেয়ে আরও যোগ করে। এটি প্যারেন্ট নোড, এক্সএমএল উত্সের লাইন নম্বর ইত্যাদির মতো তথ্যে সহজে অ্যাক্সেস সরবরাহ করে যা বেশ কয়েকটি দৃশ্যে খুব কার্যকর হতে পারে।
সাহিল গোধন

13
দেখে মনে হচ্ছে এলিমেট্রিতে কিছু দুর্বলতার সমস্যা রয়েছে, এটি ডক্সের একটি উদ্ধৃতি: Warning The xml.etree.ElementTree module is not secure against maliciously constructed data. If you need to parse untrusted or unauthenticated data see XML vulnerabilities.
ক্রিশ্চিক

5
@ ক্রিশটিক এটি বেশিরভাগ এক্সএমএল পার্সারের ক্ষেত্রে বলে মনে হচ্ছে, এক্সএমএল দুর্বলতার পৃষ্ঠাটি দেখুন
গীতারিক

427

minidom দ্রুততম এবং বেশ সোজা এগিয়ে।

এক্সএমএল:

<data>
    <items>
        <item name="item1"></item>
        <item name="item2"></item>
        <item name="item3"></item>
        <item name="item4"></item>
    </items>
</data>

পাইথন:

from xml.dom import minidom
xmldoc = minidom.parse('items.xml')
itemlist = xmldoc.getElementsByTagName('item')
print(len(itemlist))
print(itemlist[0].attributes['name'].value)
for s in itemlist:
    print(s.attributes['name'].value)

আউটপুট:

4
item1
item1
item2
item3
item4

9
আপনি কীভাবে "আইটেম 1" এর মান পাবেন? উদাহরণস্বরূপ: <আইটেম নাম = "আইটেম 1"> মান 1 </item>
swmcdonnell

88
আমি এটি বুঝতে পেরেছি, কারও ক্ষেত্রে যদি একই প্রশ্ন থাকে। এটি এস.ইল্ডনোডস [0] .নোডভ্যালু
swmcdonnell

1
আমি আপনার উদাহরণটি পছন্দ করি, আমি এটি বাস্তবায়ন করতে চাই তবে আমি মিনিডম ফাংশনগুলি কোথায় পাব। পাইথন মিনিডম ওয়েবসাইটটি আমার মতে সফল হয়।
দ্রুদ্দিন

1
আমিও বিভ্রান্ত হয়েছি কেন এটি itemডকুমেন্টের শীর্ষ স্তর থেকে সোজা খুঁজে পায় ? আপনি যদি এটি সরবরাহ করেন তবে এটি পরিষ্কার হবে না ( data->items)? কারণ, যদি data->secondSetOfItemsআপনারও এরও নোড থাকে itemএবং আপনি দুটি সেট এর মধ্যে একটির তালিকা করতে চান item?
উভচর

1
দয়া করে দেখুন stackoverflow.com/questions/21124018/...
amphibient

240

আপনি বিউটিউসসুপ ব্যবহার করতে পারেন :

from bs4 import BeautifulSoup

x="""<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>"""

y=BeautifulSoup(x)
>>> y.foo.bar.type["foobar"]
u'1'

>>> y.foo.bar.findAll("type")
[<type foobar="1"></type>, <type foobar="2"></type>]

>>> y.foo.bar.findAll("type")[0]["foobar"]
u'1'
>>> y.foo.bar.findAll("type")[1]["foobar"]
u'2'

@ আইবিজেড, হ্যাঁ, তথ্যের জন্য ধন্যবাদ, উত্স যদি উত্সটি সুগঠিত না হয় তবে পার্সারদের পক্ষেও পার্স করা কঠিন।
আপনি

45
তিন বছর পরে বিএস 4 দিয়ে এটি একটি দুর্দান্ত সমাধান, খুব নমনীয়, বিশেষত উত্সটি ভালভাবে তৈরি না হলে
সিডবেউ

8
@ আপনি BeautifulStoneSoupপছন্দসই স্রেফ ব্যবহার করুনBeautifulSoup(source_xml, features="xml")
andilabs

5
আরও 3 বছর পরে, আমি কেবল এক্সএমএল ব্যবহার করে লোড করার চেষ্টা করেছি ElementTree, দুর্ভাগ্যক্রমে আমি স্থানগুলিতে উত্সটি সামঞ্জস্য না করে পার্স করতে পারছি না তবে BeautifulSoupকোনও পরিবর্তন ছাড়াই সরাসরি কাজ করেছি!
ভাইকিগ

8
আপনি এবং "আপনাকে প্রত্যাখ্যান করা হয়েছে" বলতে চাইছেন "অবচয়" এর অর্থ এটি কমে যায়, সাধারণত বয়সের কারণে বা পরিধানের কারণে এবং সাধারণ ব্যবহার থেকে ছিঁড়ে যায়।
jpmc26

98

সেখানে অনেকগুলি বিকল্প রয়েছে। গতি এবং মেমরির ব্যবহার কোনও সমস্যা হলে সিলেটমেন্ট ট্রি দুর্দান্ত দেখায়। এটি ব্যবহার করে কেবল ফাইলটি পড়ার তুলনায় খুব কম ওভারহেড রয়েছে readlines

সিলেটমেন্ট ট্রি ওয়েবসাইট থেকে অনুলিপিযুক্ত নীচের টেবিলের সাথে সম্পর্কিত মেট্রিকগুলি পাওয়া যাবে :

library                         time    space
xml.dom.minidom (Python 2.1)    6.3 s   80000K
gnosis.objectify                2.0 s   22000k
xml.dom.minidom (Python 2.4)    1.4 s   53000k
ElementTree 1.2                 1.6 s   14500k  
ElementTree 1.2.4/1.3           1.1 s   14500k  
cDomlette (C extension)         0.540 s 20500k
PyRXPU (C extension)            0.175 s 10850k
libxml2 (C extension)           0.098 s 16000k
readlines (read as utf-8)       0.093 s 8850k
cElementTree (C extension)  --> 0.047 s 4900K <--
readlines (read as ascii)       0.032 s 5050k   

@ জেফএস দ্বারা চিহ্নিত হিসাবে , cElementTreeপাইথনের সাথে একত্রিত হয়:

  • পাইথন 2: from xml.etree import cElementTree as ElementTree
  • পাইথন 3: from xml.etree import ElementTree(ত্বরণযুক্ত সি সংস্করণটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়)।

9
সিলেটমেন্ট ব্যবহারের কি কোনও ডাউনসাইড রয়েছে? এটি একটি মস্তিষ্কবিহীন বলে মনে হচ্ছে।
mayhewsw

6
স্পষ্টতই তারা ওএস এক্স-এ লাইব্রেরিটি ব্যবহার করতে চান না কারণ আমি কোথা থেকে এটি ডাউনলোড করব এবং কোন লিঙ্ক কাজ করে না তা বের করার জন্য 15 মিনিটের বেশি সময় ব্যয় করেছি। ডকুমেন্টেশনের অভাবে ভাল প্রকল্পগুলি সমৃদ্ধ হতে বাধা দেয়, আশা করি আরও লোকেরা এটি উপলব্ধি করতে পারে।
স্টানার

8
@ সুনটনার: এটি স্টাডলিবের মধ্যে রয়েছে, আপনাকে কিছু ডাউনলোড করার দরকার নেই। উপর পাইথন 2: from xml.etree import cElementTree as ElementTree। পাইথন 3 এ: from xml.etree import ElementTree(ত্বরণযুক্ত সি সংস্করণটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়)
ত্বরণযুক্ত jfs

1
@ মাইহিউজউ ElementTreeকোনও নির্দিষ্ট কাজের জন্য কীভাবে দক্ষতার সাথে ব্যবহার করতে হবে তা নির্ধারণের জন্য আরও প্রচেষ্টা করা । মেমরিতে উপযুক্ত নথির জন্য, এটি ব্যবহার করা অনেক সহজ minidomএবং এটি ছোট এক্সএমএল নথিগুলির জন্য দুর্দান্ত কাজ করে fine
একিউম্যানাস

44

আমি সরলতার জন্য xmltodict পরামর্শ দিই

এটি আপনার এক্সএমএলকে অর্ডারডিক্টে পার্স করে;

>>> e = '<foo>
             <bar>
                 <type foobar="1"/>
                 <type foobar="2"/>
             </bar>
        </foo> '

>>> import xmltodict
>>> result = xmltodict.parse(e)
>>> result

OrderedDict([(u'foo', OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'1')]), OrderedDict([(u'@foobar', u'2')])])]))]))])

>>> result['foo']

OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'1')]), OrderedDict([(u'@foobar', u'2')])])]))])

>>> result['foo']['bar']

OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'1')]), OrderedDict([(u'@foobar', u'2')])])])

3
একমত। আপনার যদি এক্সপথ বা জটিল কিছু না প্রয়োজন হয় তবে এটি ব্যবহার করা খুব সহজ (বিশেষত দোভাষীতে); আরএসটি এপিআইগুলির জন্য সহজ যা জেএসএনের পরিবর্তে এক্সএমএল প্রকাশ করে
ড্যান পাসারো

4
মনে রাখবেন যে অর্ডারডিক্ট ডুপ্লিকেট কীগুলি সমর্থন করে না। বেশিরভাগ এক্সএমএল একই ধরণের একাধিক ভাইবোনকে ভরাট করে থাকে (বলুন, কোনও বিভাগের সমস্ত অনুচ্ছেদ বা আপনার বারের সমস্ত প্রকার)। সুতরাং এটি কেবল খুব সীমাবদ্ধ বিশেষ ক্ষেত্রে কাজ করবে।
টেক্সটজিক

2
@ টেক্সটগীক এই ক্ষেত্রে, result["foo"]["bar"]["type"]সমস্ত <type>উপাদানগুলির একটি তালিকা , তাই এটি এখনও কাজ করছে (যদিও কাঠামোটি কিছুটা অপ্রত্যাশিত হলেও)।
লুয়েটর

38

lxml.objectify সত্যিই সহজ।

আপনার নমুনা পাঠ্য গ্রহণ:

from lxml import objectify
from collections import defaultdict

count = defaultdict(int)

root = objectify.fromstring(text)

for item in root.bar.type:
    count[item.attrib.get("foobar")] += 1

print dict(count)

আউটপুট:

{'1': 1, '2': 1}

countএকটি অভিধানে প্রতিটি আইটেমের সংখ্যা ডিফল্ট কী সহ সংরক্ষণ করে, তাই আপনাকে সদস্যতার জন্য পরীক্ষা করতে হবে না। আপনি দেখার চেষ্টা করতে পারেন collections.Counter
রায়ান জিনস্ট্রোম

20

এক্সথ এক্সএমএল পার্সারের কাছে পাইথনের একটি ইন্টারফেস রয়েছে।

xml.parsers.expat

এটি একটি বৈধকরণ বৈধকরণ পার্সার, সুতরাং খারাপ এক্সএমএল ধরা পড়বে না। তবে যদি আপনি জানেন যে আপনার ফাইলটি সঠিক, তবে এটি দুর্দান্ত and

stringofxml = """<foo>
    <bar>
        <type arg="value" />
        <type arg="value" />
        <type arg="value" />
    </bar>
    <bar>
        <type arg="value" />
    </bar>
</foo>"""
count = 0
def start(name, attr):
    global count
    if name == 'type':
        count += 1

p = expat.ParserCreate()
p.StartElementHandler = start
p.Parse(stringofxml)

print count # prints 4

+1 কারণ আমি একটি অ-বৈধতা বিশ্লেষণকারী পার্সার সন্ধান করছি যা উইন্ডার্ড উত্স অক্ষরের সাথে কাজ করবে। আশা করি এটি আমাকে যে ফলাফলগুলি দেবে তা দেবে।
নাথান সি। ট্রেশেচ

1
উদাহরণটি '09-এ তৈরি হয়েছিল এবং এটি এটি করা হয়েছিল।
টোর ভ্যালামো

13

আমি ডিক্লেক্সএমএল পরামর্শ দিতে পারে ।

সম্পূর্ণ প্রকাশ: আমি এই লাইব্রেরিটি লিখেছি কারণ আমি এলিমেট্রি দিয়ে কয়েক ডজন লাইন আবশ্যকীয় পার্সিং / সিরিয়ালাইজেশন কোড লেখার প্রয়োজন ছাড়াই এক্সএমএল এবং পাইথন ডেটা স্ট্রাকচারের মধ্যে রূপান্তর করার উপায় খুঁজছিলাম।

ডেক্সএক্সএলএমএল সহ, আপনি প্রসেসরগুলি আপনার এক্সএমএল নথিটির কাঠামো ঘোষণামূলকভাবে সংজ্ঞায়িত করতে এবং এক্সএমএল এবং পাইথন ডেটা স্ট্রাকচারের মধ্যে কীভাবে ম্যাপ করবেন তা ব্যবহার করুন। প্রসেসরগুলি সিরিয়ালাইজেশন এবং পার্সিং এবং পাশাপাশি বৈধতার প্রাথমিক স্তরের জন্য ব্যবহৃত হয়।

পাইথন ডেটা স্ট্রাকচারে পার্সিং করা সহজবোধ্য:

import declxml as xml

xml_string = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>
"""

processor = xml.dictionary('foo', [
    xml.dictionary('bar', [
        xml.array(xml.integer('type', attribute='foobar'))
    ])
])

xml.parse_from_string(processor, xml_string)

যা আউটপুট উত্পাদন করে:

{'bar': {'foobar': [1, 2]}}

আপনি এক্সএমএলে ডেটা সিরিয়ালাইজ করতে একই প্রসেসরটি ব্যবহার করতে পারেন

data = {'bar': {
    'foobar': [7, 3, 21, 16, 11]
}}

xml.serialize_to_string(processor, data, indent='    ')

যা নিম্নলিখিত আউটপুট উত্পাদন করে

<?xml version="1.0" ?>
<foo>
    <bar>
        <type foobar="7"/>
        <type foobar="3"/>
        <type foobar="21"/>
        <type foobar="16"/>
        <type foobar="11"/>
    </bar>
</foo>

আপনি যদি অভিধানের পরিবর্তে অবজেক্টের সাথে কাজ করতে চান তবে আপনি প্রসেসরগুলি সংখ্যার পাশাপাশি অবজেক্টগুলিতে এবং ডেটা রুপান্তর করতে সংজ্ঞায়িত করতে পারেন।

import declxml as xml

class Bar:

    def __init__(self):
        self.foobars = []

    def __repr__(self):
        return 'Bar(foobars={})'.format(self.foobars)


xml_string = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>
"""

processor = xml.dictionary('foo', [
    xml.user_object('bar', Bar, [
        xml.array(xml.integer('type', attribute='foobar'), alias='foobars')
    ])
])

xml.parse_from_string(processor, xml_string)

যা নিম্নলিখিত আউটপুট উত্পাদন করে

{'bar': Bar(foobars=[1, 2])}

13

অন্য একটি সম্ভাবনা যুক্ত করার জন্য, আপনি আনট্যাঙ্গেলটি ব্যবহার করতে পারেন , কারণ এটি একটি সাধারণ এক্সএমএল থেকে পাইথন-অবজেক্ট লাইব্রেরি। এখানে আপনার একটি উদাহরণ রয়েছে:

স্থাপন:

pip install untangle

ব্যবহার:

আপনার এক্সএমএল ফাইল (কিছুটা পরিবর্তন হয়েছে):

<foo>
   <bar name="bar_name">
      <type foobar="1"/>
   </bar>
</foo>

এর সাথে গুণাবলী অ্যাক্সেস করা untangle:

import untangle

obj = untangle.parse('/path_to_xml_file/file.xml')

print obj.foo.bar['name']
print obj.foo.bar.type['foobar']

আউটপুটটি হবে:

bar_name
1

আনটাঙ্গল সম্পর্কে আরও তথ্য " আনটাঙ্গল " এ পাওয়া যাবে ।

এছাড়াও, আপনি যদি কৌতূহলী হন তবে XML এবং পাইথনের সাথে " পাইথন এবং এক্সএমএল " তে কাজ করার জন্য সরঞ্জামগুলির একটি তালিকা পেতে পারেন । আপনি আরও দেখতে পাবেন যে সর্বাধিক সাধারণগুলি পূর্ববর্তী উত্তরগুলির দ্বারা উল্লেখ করা হয়েছিল।


মিনিডোম থেকে কি আনআউটংকে আলাদা করে তোলে?
হারুন মান

আমি মিনিডোম নিয়ে কাজ করি নি বলে এই দুজনের মধ্যে পার্থক্য বলতে পারছি না।
জ্যাঞ্জার

10

এখানে একটি খুব সাধারণ তবে কার্যকর কোড cElementTree

try:
    import cElementTree as ET
except ImportError:
  try:
    # Python 2.5 need to import a different module
    import xml.etree.cElementTree as ET
  except ImportError:
    exit_err("Failed to import cElementTree from any known place")      

def find_in_tree(tree, node):
    found = tree.find(node)
    if found == None:
        print "No %s in file" % node
        found = []
    return found  

# Parse a xml file (specify the path)
def_file = "xml_file_name.xml"
try:
    dom = ET.parse(open(def_file, "r"))
    root = dom.getroot()
except:
    exit_err("Unable to open and parse input definition file: " + def_file)

# Parse to find the child nodes list of node 'myNode'
fwdefs = find_in_tree(root,"myNode")

এটি " পাইথন এক্সএমএল পার্স " থেকে।


7

এক্সএমএল:

<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>

পাইথন কোড:

import xml.etree.cElementTree as ET

tree = ET.parse("foo.xml")
root = tree.getroot() 
root_tag = root.tag
print(root_tag) 

for form in root.findall("./bar/type"):
    x=(form.attrib)
    z=list(x)
    for i in z:
        print(x[i])

আউটপুট:

foo
1
2

6

xML.etree.ElementTree বনাম lxML

এগুলি দুটি সর্বাধিক ব্যবহৃত লাইব্রেরির কয়েকটি পেশাদার যা আমি তাদের মধ্যে চয়ন করার আগে জেনে উপকার পেতে পারি।

xml.etree.ElementTree:

  1. থেকে মান গ্রন্থাগার : কোন কোন মডিউল ইনস্টল চাহিদা

lxml

  1. সহজেই এক্সএমএল ঘোষণা লিখুন : উদাহরণস্বরূপ আপনার যুক্ত করা দরকার standalone="no"?
  2. বেশিরভাগ মুদ্রণ : অতিরিক্ত কোড ছাড়াই আপনার একটি দুর্দান্ত ইনডেন্টেড এক্সএমএল থাকতে পারে ।
  3. কাজে পরিণত করা কার্যকারিতা: এটা যদি আপনি একটি স্বাভাবিক পাইথন বস্তুর অনুক্রমের সাথে ডিল করা হয়েছে যেমন XML ব্যবহার করতে পারবেন .node

6
import xml.etree.ElementTree as ET
data = '''<foo>
           <bar>
               <type foobar="1"/>
               <type foobar="2"/>
          </bar>
       </foo>'''
tree = ET.fromstring(data)
lst = tree.findall('bar/type')
for item in lst:
    print item.get('foobar')

এটি গুণকের মানটি মুদ্রণ করবে foobar


5

আমি পাইথন xML.dom এবং xML.dom.minidom দেখতে বেশ সহজ। মনে রাখবেন যে ডোমটি প্রচুর পরিমাণে এক্সএমএলের জন্য ভাল নয়, তবে যদি আপনার ইনপুটটি মোটামুটি ছোট হয় তবে এটি সূক্ষ্মভাবে কাজ করবে।


2

আছে একটি liberal এর সংক্ষিপ্ত রূপ নির্দিষ্ট API- টি ব্যবহার করার কোন প্রয়োজন যদি আপনি ব্যবহার python-benedict। আপনার এক্সএমএল থেকে কেবল একটি নতুন উদাহরণ শুরু করুন এবং এটি একটি dictসাবক্লাস হওয়ায় এটি সহজেই পরিচালনা করুন ।

ইনস্টলেশন সহজ: pip install python-benedict

from benedict import benedict as bdict

# data-source can be an url, a filepath or data-string (as in this example)
data_source = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>"""

data = bdict.from_xml(data_source)
t_list = data['foo.bar'] # yes, keypath supported
for t in t_list:
   print(t['@foobar'])

এটা তোলে সমর্থন করে এবং normalizes অনেক ফরম্যাটের সঙ্গে ইনপুট / আউটপুট অপারেশন: Base64, CSV, JSON, TOML, XML, YAMLএবংquery-string

এটি গিটহাবের ভাল পরীক্ষিত এবং ওপেন সোর্স ।


0
#If the xml is in the form of a string as shown below then
from lxml  import etree, objectify
'''sample xml as a string with a name space {http://xmlns.abc.com}'''
message =b'<?xml version="1.0" encoding="UTF-8"?>\r\n<pa:Process xmlns:pa="http://xmlns.abc.com">\r\n\t<pa:firsttag>SAMPLE</pa:firsttag></pa:Process>\r\n'  # this is a sample xml which is a string


print('************message coversion and parsing starts*************')

message=message.decode('utf-8') 
message=message.replace('<?xml version="1.0" encoding="UTF-8"?>\r\n','') #replace is used to remove unwanted strings from the 'message'
message=message.replace('pa:Process>\r\n','pa:Process>')
print (message)

print ('******Parsing starts*************')
parser = etree.XMLParser(remove_blank_text=True) #the name space is removed here
root = etree.fromstring(message, parser) #parsing of xml happens here
print ('******Parsing completed************')


dict={}
for child in root: # parsed xml is iterated using a for loop and values are stored in a dictionary
    print(child.tag,child.text)
    print('****Derving from xml tree*****')
    if child.tag =="{http://xmlns.abc.com}firsttag":
        dict["FIRST_TAG"]=child.text
        print(dict)


### output
'''************message coversion and parsing starts*************
<pa:Process xmlns:pa="http://xmlns.abc.com">

    <pa:firsttag>SAMPLE</pa:firsttag></pa:Process>
******Parsing starts*************
******Parsing completed************
{http://xmlns.abc.com}firsttag SAMPLE
****Derving from xml tree*****
{'FIRST_TAG': 'SAMPLE'}'''

আপনার উত্তর কীভাবে সমস্যার সমাধান করে তা বোঝাতে দয়া করে কিছু প্রসঙ্গও অন্তর্ভুক্ত করুন। কোড-কেবল উত্তরগুলি উত্সাহিত হয় না।
পেড্রাম পারসিয়ান

-1

উত্সটি যদি কোনও এক্সএমএল ফাইল হয় তবে এই নমুনার মতো বলুন

<pa:Process xmlns:pa="http://sssss">
        <pa:firsttag>SAMPLE</pa:firsttag>
    </pa:Process>

আপনি নিম্নলিখিত কোড চেষ্টা করতে পারেন

from lxml import etree, objectify
metadata = 'C:\\Users\\PROCS.xml' # this is sample xml file the contents are shown above
parser = etree.XMLParser(remove_blank_text=True) # this line removes the  name space from the xml in this sample the name space is --> http://sssss
tree = etree.parse(metadata, parser) # this line parses the xml file which is PROCS.xml
root = tree.getroot() # we get the root of xml which is process and iterate using a for loop
for elem in root.getiterator():
    if not hasattr(elem.tag, 'find'): continue  # (1)
    i = elem.tag.find('}')
    if i >= 0:
        elem.tag = elem.tag[i+1:]

dict={}  # a python dictionary is declared
for elem in tree.iter(): #iterating through the xml tree using a for loop
    if elem.tag =="firsttag": # if the tag name matches the name that is equated then the text in the tag is stored into the dictionary
        dict["FIRST_TAG"]=str(elem.text)
        print(dict)

আউটপুট হবে

{'FIRST_TAG': 'SAMPLE'}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.