2009-09-29 12 views
24

मुझे पायथन पसंद है, लेकिन मैं सिर्फ तत्व से एक विशेषता प्राप्त करने के लिए 10 लाइनों को लिखना नहीं चाहता हूं। शायद यह सिर्फ मुझे है, लेकिन minidommini नहीं है। कोड का उपयोग करने के लिए मुझे जो कोड लिखना है उसे जावा कोड की तरह दिखता है।क्या कोई पाइथन एक्सएमएल पार्सर है जो मनुष्यों के साथ दिमाग में बनाया गया था?

क्या कुछ ऐसा है जो user-friendly है? ओवरलोडेड ऑपरेटरों के साथ कुछ, और कौन से तत्व वस्तुओं को मानचित्रित करता है? getChildren या ऐसा कुछ अन्य तरीकों का उपयोग कर


obj = parse(xml_string) 
print obj.node.value 

और नहीं:

मैं इस उपयोग करने में सक्षम होना चाहते हैं:


<root> 
<node value="30">text</node> 
</root> 
कुछ के रूप में इस तरह

+1

क्या XPath उपयोगकर्ता के अनुकूल के रूप में गिना जाता है? http://stackoverflow.com/questions/8692/how-to-use-xpath-in-python – Welbog

+0

मुझे इसके जावा संस्करण में बहुत दिलचस्पी होगी! – Federer

उत्तर

22

आपको ElementTree पर एक नज़र रखना चाहिए। यह वही नहीं कर रहा है जो आप चाहते हैं लेकिन यह मिनीडॉम के बाद बहुत बेहतर है। अगर मुझे सही ढंग से याद है, पाइथन 2.4 से शुरू होता है, तो यह मानक पुस्तकालयों में शामिल है। अधिक गति उपयोग CElementTree के लिए। अधिक गति (और अधिक विशेषताओं) के लिए आप lxml का उपयोग कर सकते हैं (अपनी आवश्यकताओं/दृष्टिकोण के लिए ऑब्जेक्ट API देखें)।

मुझे उस BeautifulSoup को जो कुछ भी आप चाहते हैं उसे जोड़ना चाहिए। Amara भी है जो इस दृष्टिकोण को है।

+3

+1, एलिमेंट ट्री उत्कृष्ट है। – Mark

+0

एलिमेंटट्री उत्कृष्ट है। –

+0

सहमत, ElementTree उपयोग करने के लिए बहुत आसान है। फैंसी-नेमस्पेस (अभी तक) के साथ इतना अच्छा नहीं है लेकिन हर समय बेहतर हो रहा है। जब संभव हो minidom से बचें। –

3

मैंने वास्तव में एक पुस्तकालय लिखा है जो चीजों को ठीक उसी तरह करता है जिस तरह से आपने कल्पना की थी। लाइब्रेरी को "xe" कहा जाता है और आप इसे प्राप्त कर सकते हैं: http://home.avvanta.com/~steveha/xe.html

xe आपको ऑब्जेक्ट उन्मुख तरीके से डेटा के साथ काम करने के लिए XML आयात कर सकता है। यह वास्तव में पार्सिंग करने के लिए xml.dom.minidom का उपयोग करता है, लेकिन फिर यह परिणामी पेड़ पर चलता है और डेटा को xe ऑब्जेक्ट्स में पैक करता है।

संपादित करें: ठीक है, मैं आगे बढ़ गया और xe में अपना उदाहरण लागू किया, ताकि आप देख सकें कि यह कैसे काम करता है। आपके द्वारा दिखाए गए एक्सएमएल को लागू करने के लिए कक्षाएं यहां दी गई हैं:

import xe 

class Node(xe.TextElement): 
    def __init__(self, text="", value=None): 
     xe.TextElement.__init__(self, "node", text) 
     if value is not None: 
      self.attrs["value"] = value 

class Root(xe.NestElement): 
    def __init__(self): 
     xe.NestElement.__init__(self, "root") 
     self.node = Node() 

और यहां उपर्युक्त का उपयोग करने का एक उदाहरण है। मैंने अपना नमूना एक्सएमएल "example.xml" नामक फ़ाइल में रखा है, लेकिन आप इसे एक स्ट्रिंग में भी डाल सकते हैं और स्ट्रिंग पास कर सकते हैं।

>>> root = Root() 
>>> print root 
<root/> 
>>> root.import_xml("example.xml") 
<Root object at 0xb7e0c52c> 
>>> print root 
<root> 
    <node value="30">text</node> 
</root> 
>>> print root.node.attrs["value"] 
30 
>>> 

ध्यान दें कि इस उदाहरण में, "मान" का प्रकार एक स्ट्रिंग होगा। यदि आपको वास्तव में किसी अन्य प्रकार के गुणों की आवश्यकता है, तो यह भी कुछ काम के साथ संभव है, लेकिन मैंने इस उदाहरण के लिए परेशान नहीं किया। (यदि आप ओपीएमएल देखते हैं, तो ओपीएमएल के लिए एक कक्षा है जिसमें एक विशेषता है जो पाठ नहीं है।)

2

मुझे सरल एक्सएमएल पार्सर की आवश्यकता थी और विभिन्न पुस्तकालयों की जांच करने में लंबे समय के बाद मुझे xmltramp मिला।

अपने उदाहरण एक्सएमएल के आधार पर:

import xmltramp 

xml_string = """<root> 
<node value="30">text</node> 
</root>""" 

obj = xmltramp.parse(xml_string) 
print obj.node('value')    # 30 
print str(obj.node)     # text 

मैं नहीं मिला था कुछ भी अधिक उपयोगकर्ता के अनुकूल।

0

मैंने ऊपर दिए गए उदाहरणों और पीपी पर सूचीबद्ध भंडारों के माध्यम से काफी समय बिताया।

सबसे आसान (और सबसे pythonic) पार्स XML का है कि मैं अब तक पाया है जिस तरह से किया गया है XMLToDict - https://github.com/martinblech/xmltodict

प्रलेखन से उदाहरण GitHub पर उपलब्ध ऊपर प्रतिलिपि चिपकाया नीचे है; यह जीवन बहुत आसान है और मेरे लिए बहुत समय आसान है;

>>> doc = xmltodict.parse(""" 
... <mydocument has="an attribute"> 
... <and> 
...  <many>elements</many> 
...  <many>more elements</many> 
... </and> 
... <plus a="complex"> 
...  element as well 
... </plus> 
... </mydocument> 
... """) 
>>> 
>>> doc['mydocument']['@has'] 
u'an attribute' 
>>> doc['mydocument']['and']['many'] 
[u'elements', u'more elements'] 
>>> doc['mydocument']['plus']['@a'] 
u'complex' 
>>> doc['mydocument']['plus']['#text'] 
u'element as well' 

यह वास्तव में अच्छी तरह से काम करता है और मुझे जो कुछ भी ढूंढ रहा था उसे दे दिया। हालांकि, अगर आप रिवर्स ट्रांसफॉर्मेशन देख रहे हैं, तो यह पूरी तरह से एक अलग मामला है।