मैं पायथन और lxml का उपयोग करके निम्नलिखित एक्सएमएल को पार्स करने की कोशिश कर रहा हूं:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/bind9.xsl"?>
<isc version="1.0">
  <bind>
    <statistics version="2.2">
      <memory>
        <summary>
          <TotalUse>1232952256
          </TotalUse>
          <InUse>835252452
          </InUse>
          <BlockSize>598212608
          </BlockSize>
          <ContextSize>52670016
          </ContextSize>
          <Lost>0
          </Lost>
        </summary>
      </memory>
    </statistics>
  </bind>
</isc>

लक्ष्य निम्न मैपिंग बनाने के लिए bind/statistics/memory/summary के अंतर्गत प्रत्येक तत्व का टैग नाम और टेक्स्ट निकालना है:

TotalUse: 1232952256
InUse: 835252452
BlockSize: 598212608
ContextSize: 52670016
Lost: 0

मैंने तत्व मान निकालने में कामयाब रहा है, लेकिन मैं तत्व टैग नाम प्राप्त करने के लिए xpath अभिव्यक्ति को नहीं समझ सकता।

एक नमूना स्क्रिप्ट:

from lxml import etree as et

def main():

    xmlfile = "bind982.xml"
    location = "bind/statistics/memory/summary/*"
    label_selector = "??????" ## what to put here...?
    value_selector = "text()"

    with open(xmlfile, "r") as data:
        xmldata = et.parse(data)

        etree = xmldata.getroot()

        statlist = etree.xpath(location)

        for stat in statlist:
            label = stat.xpath(label_selector)[0]
            value = stat.xpath(value_selector)[0]
            print "{0}: {1}".format(label, value)

if __name__ == '__main__':
    main()

मुझे पता है कि मैं stat.xpath() के बजाय value = stat.tag का उपयोग कर सकता हूं, लेकिन स्क्रिप्ट को एक्सएमएल के अन्य टुकड़ों को संसाधित करने के लिए पर्याप्त रूप से सामान्य होना चाहिए जहां लेबल चयनकर्ता अलग है।

कौन सा xpath चयनकर्ता किसी तत्व का टैग नाम लौटाएगा?

1
André Fernandes 6 सितंबर 2019, 19:13

2 जवाब

सबसे बढ़िया उत्तर

बस XPath के name() का उपयोग करें, और शून्य अनुक्रमणिका को हटा दें क्योंकि यह एक स्ट्रिंग देता है और सूची नहीं।

from lxml import etree as et

def main():

    xmlfile = "ExtractXPathTagName.xml"
    location = "bind/statistics/memory/summary/*"
    label_selector = "name()"                         ## what to put here...?
    value_selector = "text()"

    with open(xmlfile, "r") as data:
        xmldata = et.parse(data)

        etree = xmldata.getroot()

        statlist = etree.xpath(location)

        for stat in statlist:
            label = stat.xpath(label_selector)
            value = stat.xpath(value_selector)[0]
            print("{0}: {1}".format(label, value).strip())

if __name__ == '__main__':
    main()

आउटपुट

TotalUse: 1232952256    
InUse: 835252452    
BlockSize: 598212608    
ContextSize: 52670016    
Lost: 0
2
Parfait 6 सितंबर 2019, 21:27

मुझे लगता है कि आपको दो मानों के लिए XPath की आवश्यकता नहीं है, तत्व नोड्स में गुण tag और text हैं, इसलिए उदाहरण के लिए एक सूची समझ का उपयोग करें:

[(element.tag, element.text) for element in etree.xpath(location)]

या यदि आप वास्तव में XPath का उपयोग करना चाहते हैं

result = [(element.xpath('name()'), element.xpath('string()')) for element in etree.xpath(location)]

आप निश्चित रूप से शब्दकोशों की एक सूची भी बना सकते हैं:

result = [{ element.tag : element.text } for element in root.xpath(location)]

या

result = [{ element.xpath('name()') : element.xpath('string()') } for element in etree.xpath(location)]
0
Martin Honnen 6 सितंबर 2019, 19:34