मेरे पास बहुत सारी प्रविष्टियों के साथ एक विशाल नेस्टेड .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

क्या कोई मेरी मदद कर सकता है कि एक्सएमएल फ़ाइल को सही तरीके से कैसे पार्स करें और मुझे जो चाहिए वह प्राप्त करें?

0
hothead 22 पद 2020, 12:00

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)
0
Tomalak 22 पद 2020, 14:38
धन्यवाद, तोमालक। यह उल्लेख करना भूल गया कि मैंने उपयोग करने का प्रयास किया: प्रिंट ("% s -% s"% (element.text, element.getparent ())) लेकिन मुझे मिलता है: 012345678 - <तत्व फ़ोल्डर_ड्स 0x3b82120> 012345678 - <तत्व फ़ोल्डर_ड्स 0x3b82120 पर > आपके द्वारा सुझाया गया दूसरा तरीका काम नहीं कर रहा है। मुझे मिल रहा है: ``` सिंटेक्स त्रुटि: अमान्य विधेय ```
 – 
hothead
22 पद 2020, 12:52
आप तत्व को प्रिंट कर रहे हैं। यदि आप एलिमेंट टेक्स्ट को प्रिंट करना चाहते हैं, तो आपको एलिमेंट .text को प्रिंट करना होगा। मैंने सोचा था कि आप वह संबंध स्वयं बना लेंगे।
 – 
Tomalak
22 पद 2020, 14:34
"अमान्य विधेय" त्रुटि के बारे में - मैंने गलत विधि का उपयोग किया है (tree.xpath() के बजाय tree.iterfind())। इसे अब ठीक कर दिया गया है।
 – 
Tomalak
22 पद 2020, 14:39