2013-08-05 10 views
6

मैं एक एक्सएमएल फ़ाइल खोलने की कोशिश कर रहा हूं, और कुछ टैग से मूल्य प्राप्त कर रहा हूं। मैंने यह बहुत कुछ किया है लेकिन यह विशेष एक्सएमएल मुझे कुछ मुद्दों दे रहा है।xmlns नेमस्पेस ब्रेकिंग lxml

<?xml version='1.0' encoding='UTF-8'?> 
<package xmlns="http://apple.com/itunes/importer" version="film4.7"> 
    <provider>filmgroup</provider> 
    <language>en-GB</language> 
    <actor name="John Smith" display="Doe John"</actor> 
</package> 

यहाँ और मेरे अजगर कोड का एक नमूना है:: यहाँ xml फ़ाइल का एक वर्ग है

metadata = '/Users/mylaptop/Desktop/Python/metadata.xml' 
from lxml import etree 
parser = etree.XMLParser(remove_blank_text=True) 
open(metadata) 
tree = etree.parse(metadata, parser) 
root = tree.getroot() 
for element in root.iter(tag='provider'): 
    providerValue = tree.find('//provider') 
    providerValue = providerValue.text 
    print providerValue 
tree.write('/Users/mylaptop/Desktop/Python/metadataDone.xml', pretty_print = True, xml_declaration = True, encoding = 'UTF-8') 

जब मैं इस चलाने के यह प्रदाता टैग या अपने मूल्य नहीं मिल रहा। अगर मैं xmlns="http://apple.com/itunes/importer" हटा देता हूं तो सभी उम्मीद के अनुसार काम करते हैं। मेरा सवाल यह है कि मैं इस नेमस्पेस को कैसे हटा सकता हूं, क्योंकि मुझे इसमें कोई दिलचस्पी नहीं है, इसलिए मुझे lxml का उपयोग करने वाले टैग मान प्राप्त हो सकते हैं?

उत्तर

9

provider टैग http://apple.com/itunes/importer नाम स्थान में है, इसलिए आप या तो पूरी तरह से योग्य नाम

{http://apple.com/itunes/importer}provider 

का उपयोग करें या lxml तरीकों है कि the namespaces parameter, इस तरह के root.xpath के रूप में से एक का उपयोग करने की आवश्यकता है। तो फिर तुम एक नामस्थान उपसर्ग (जैसे ns:provider) के साथ यह निर्दिष्ट कर सकते हैं:

from lxml import etree 
parser = etree.XMLParser(remove_blank_text=True) 
tree = etree.parse(metadata, parser) 
root = tree.getroot() 
namespaces = {'ns':'http://apple.com/itunes/importer'} 
items = iter(root.xpath('//ns:provider/text()|//ns:actor/@name', 
         namespaces=namespaces)) 
for provider, actor in zip(*[items]*2): 
    print(provider, actor) 

पैदावार

('filmgroup', 'John Smith') 

नोट ऊपर उपयोग XPath मानता है कि कि <provider> और <actor> तत्वों हमेशा प्रत्यावर्तन में दिखाई देते हैं। यदि यह सच नहीं है, तो निश्चित रूप से तरीके से निपटने के लिए कर रहे हैं, लेकिन कोड में थोड़ा और अधिक वर्बोज़ हो जाता है:

for package in root.xpath('//ns:package', namespaces=namespaces): 
    for provider in package.xpath('ns:provider', namespaces=namespaces): 
     providerValue = provider.text 
     print providerValue 
    for actor in package.xpath('ns:actor', namespaces=namespaces): 
     print actor.attrib['name'] 
+0

यही उत्कृष्ट ubuntu, काम करता है इलाज, चियर्स:

providers = getels(root, 'provider', ns='http://apple.com/itunes/importer') 

यहाँ उन कार्यों कर रहे हैं। – speedyrazor

+0

उबंटू, मुझे टैग की विशेषता कैसे मिलेगी, मैंने अपना मूल उदाहरण संशोधित किया है, इसलिए मैं अभिनेता नाम = – speedyrazor

+0

के मूल्य की तलाश में हूं यदि आपके पास 'तत्व' है, तो आप 'तत्व' के साथ विशेषता मान तक पहुंच सकते हैं .attrib [ 'नाम'] '। हालांकि, यदि आप किसी XML फ़ाइल से 'प्रदाता' और 'अभिनेता' तत्वों को स्क्रैप कर रहे हैं, तो आप '| '(या) वाक्यविन्यास का उपयोग करके दोनों को एक ही XPath सेट अप कर सकते हैं। मैंने यह दिखाने के लिए पोस्ट संपादित किया है कि मेरा क्या मतलब है। – unutbu

1

मेरे सुझाव नाम स्थान की अनदेखी करने के लिए नहीं है, लेकिन उन्हें इस पर ध्यान में रखना है। मैंने django-quickbooks लाइब्रेरी पर अपने काम के लिए कुछ संबंधित कार्यों (मामूली संशोधन के साथ कॉपी) लिखा था। इन कार्यों के साथ, आप यह करने के लिए सक्षम होना चाहिए:

def get_tag_with_ns(tag_name, ns): 
    return '{%s}%s' % (ns, tag_name) 

def getel(elt, tag_name, ns=None): 
    """ Gets the first tag that matches the specified tag_name taking into 
    account the QB namespace. 

    :param ns: The namespace to use if not using the default one for 
    django-quickbooks. 
    :type ns: string 
    """ 

    res = elt.find(get_tag_with_ns(tag_name, ns=ns)) 
    if res is None: 
     raise TagNotFound('Could not find tag by name "%s"' % tag_name) 
    return res 

def getels(elt, *path, **kwargs): 
    """ Gets the first set of elements found at the specified path. 

    Example: 
     >>> xml = (
     "<root>" + 
      "<item>" + 
       "<id>1</id>" + 
      "</item>" + 
      "<item>" + 
       "<id>2</id>"* + 
      "</item>" + 
     "</root>") 
     >>> el = etree.fromstring(xml) 
     >>> getels(el, 'root', 'item', ns='correct/namespace') 
     [<Element item>, <Element item>] 
    """ 

    ns = kwargs['ns'] 

    i=-1 
    for i in range(len(path)-1): 
     elt = getel(elt, path[i], ns=ns) 
    tag_name = path[i+1] 
    return elt.findall(get_tag_with_ns(tag_name, ns=ns)) 
संबंधित मुद्दे