2015-07-20 24 views
5

lxml मैं अजगर lxml पुस्तकालय का उपयोग कर रहा है एक नया स्कीमा के एक्सएमएल फाइल को बदलने के लिए, लेकिन मैं एक्सएमएल शरीर से प्रोसेसिंग निर्देश पार्स करने में समस्याएं आई थी।अजगर के साथ प्रसंस्करण निर्देश निकाला जा रहा है

प्रोसेसिंग निर्देश तत्वों, एक्सएमएल में फैले हुए कर रहे हैं निम्न उदाहरण में (वे सब "Oasys" के साथ शुरू और एक अद्वितीय कोड के साथ समाप्त):

string = "<text><?oasys _dc21-?>Text <i>contents</i></text>" 

मैं उन के माध्यम से पता नहीं लगा सकते विधि है, हालांकि etree.getchildren() उन्हें रिटर्न:

tree = lxml.etree.fromstring(string) 
print tree.findall(".//") 
>>>> [<Element i at 0x747c>] 
print tree.getchildren() 
>>>> [<?oasys _dc21-?>, <Element i at 0x747x>] 
print tree.getchildren()[0].tag 
>>>> <built-in function ProcessingInstruction> 
print tree.getchildren()[0].tail 
>>>> Text 

वहाँ getchildren() का उपयोग कर पार्स और प्रोसेसिंग निर्देश दूर करने के लिए, विशेष रूप से विचार कर रहा है कि वे अपरोक्ष विभिन्न स्तरों पर नेस्ट रहे हैं के लिए एक विकल्प है एक्सएमएल के बारे में?

उत्तर

6

आप प्रसंस्करण निर्देशों को ढूंढने के लिए processing-instruction() XPath नोड परीक्षण का उपयोग कर सकते हैं और etree.strip_tags() का उपयोग करके उन्हें हटा सकते हैं।

उदाहरण:

from lxml import etree 

string = "<text><?oasys _dc21-?>Text <i>contents</i></text>" 
tree = etree.fromstring(string) 

pis = tree.xpath("//processing-instruction()") 
for pi in pis: 
    etree.strip_tags(pi.getparent(), pi.tag) 

print etree.tostring(tree) 

आउटपुट:

<text>Text <i>contents</i></text> 
+0

आप वास्तव में अपने जवाब के साथ दो समस्याओं को हल किया गया है - मैं strip_tags() फ़ंक्शन के बारे में पता नहीं था, लेकिन यह बहुत उपयोगी है! –

संबंधित मुद्दे