मेरे पास बहुत सारी प्रविष्टियों के साथ एक विशाल नेस्टेड .xml फ़ाइल है। अगर मुझे चाइल्ड आईडी पता है तो मुझे पिछले मूल्य को खोजने की आवश्यकता है।
मेरी एक्सएमएल फ़ाइल का निष्कर्षण:
<?xml version="1.0"?>
<nodes>
<node>
<node_id>0x2D</node_id>
<num_1>11</num_1>
<num_2>905.908</num_2>
<signs>
<sign>
<sign_id>30</sign_id>
<name>INDEX_0</name>
<size_b>842069</size_b>
<content>
<models>
<model>1_x</model>
<model>2_x</model>
<model>3_x</model>
<model>4_x</model>
</models>
<images>
<image>
<value>VALUE1</value>
<folder_ids>
<folder_id>012345678</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE2</value>
<folder_ids>
<folder_id>1235365454</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE3</value>
<folder_ids>
<folder_id>3562377456</folder_id>
<folder_id>3566743626</folder_id>
<folder_id>012345678</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE4</value>
<folder_ids>
<folder_id>34627876</folder_id>
</folder_ids>
</image>
<image>
.
.
.
तो उदाहरण के लिए यदि मुझे 012345678 फ़ोल्डर_आईडी वाले सभी मानों को खोजने की आवश्यकता है। मैंने एलएक्सएमएल लाइब्रेरी का उपयोग करने की कोशिश की। सरल कोड:
from lxml import etree
tree = etree.parse('D:\\test_nested_xml.xml')
#root = etree.Element("root")
for element in tree.iter(tag="folder_id"):
if element.text == '012345678':
print("%s - %s" % (element.text, element.getparent))
लेकिन आउटपुट में मुझे निम्नलिखित प्रविष्टियाँ मिलती हैं:
012345678 - <bound method _Element.getparent of <Element folder_id at 0x2cf2648>>
012345678 - <bound method _Element.getparent of <Element folder_id at 0x2cf2620>>
और यह वह नहीं है जो मुझे चाहिए।
मेरे लिए अपेक्षित परिणाम कुछ ऐसा है:
012345678 - VALUE1
012345678 - VALUE3
क्या कोई मेरी मदद कर सकता है कि एक्सएमएल फ़ाइल को सही तरीके से कैसे पार्स करें और मुझे जो चाहिए वह प्राप्त करें?
1 उत्तर
आप वर्तमान में विधि को ही प्रिंट कर रहे हैं।
print("%s - %s" % (element.text, element.getparent))
यदि आप यह देखना चाहते हैं कि रिटर्न क्या विधि है, तो आपको इसे कॉल करना होगा।
print("%s - %s" % (element.text, element.getparent()))
आप एक चरण में वांछित मानों का चयन करने के लिए XPath का भी उपयोग कर सकते हैं:
search_id = '012345678'
for value in tree.xpath(f"//image[folder_ids/folder_id='{search_id}']/value"):
print(value.text)
संबंधित सवाल
नए सवाल
python-3.x
पायथन प्रोग्रामिंग के बारे में प्रश्नों के लिए जो भाषा के संस्करण 3+ के लिए विशिष्ट हैं। सभी पायथन सवालों पर अधिक जेनेरिक [अजगर] टैग का उपयोग करें, और केवल यह जोड़ें यदि आपका प्रश्न संस्करण-विशिष्ट है। पायथन 2 प्रश्नों के लिए [अजगर -2] टैग का उपयोग करें।
.text
को प्रिंट करना होगा। मैंने सोचा था कि आप वह संबंध स्वयं बना लेंगे।tree.xpath()
के बजायtree.iterfind()
)। इसे अब ठीक कर दिया गया है।