2012-10-13 25 views
8

मान लीजिए मैं इस तरह एक्सएमएल है:जब Python में prettyprinting xml में विशेषताओं को इंडेंट करना है?

<graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML" directed="1"> 
    <foo>...</foo> 
</graph> 

अपने सभी विशेषताओं पूरा एक पंक्ति पर प्रकट साथ पहला तत्व नाम।

मैंने देखा है कि कैसे सुंदर इस तरह कोड के साथ तत्व पेड़ मुद्रित करने के लिए, lxml का उपयोग कर,:

from lxml import etree 
... 
def prettyPrintXml(filePath): 
    assert filePath is not None 
    parser = etree.XMLParser(resolve_entities=False, remove_blank_text=True, 
          strip_cdata=False) 
    document = etree.parse(filePath, parser) 
    print(etree.tostring(document, pretty_print=True, encoding='utf-8')) 

... लेकिन यह है कि, हर तत्व एक पंक्ति में दिखाई दे इस्तेमाल करते हैं।

क्या तत्व प्रिंटर के बीच नई पंक्तियों को सम्मिलित करने के लिए सुंदर प्रिंटर को बताने के लिए एक जादू की घटना है, उदाहरण के लिए, रेखा की लंबाई 80 characaters से अधिक नहीं है?

मैं परिणाम चाहते हैं कुछ इस तरह देखने के लिए:

<graph label="Test" 
     xmlns:dc="http://purl.org/dc/elements/1.1/" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:cy="http://www.cytoscape.org" 
     xmlns="http://www.cs.rpi.edu/XGMML" directed="1"> 
    <foo>...</foo> 
</graph> 

ps: मैं subprocess और xmllint

उत्तर

2

lxml का सहारा नहीं करना चाहती एक सुंदर प्रिंट समारोह में बनाया गया है: here's a tutorial जो एक्सएमएल मुद्रित करने के कई तरीकों का वर्णन करता है। इसमें कुछ limitations (एलएमएलएमएल के अनुसार, एक्सएमएल चश्मा में सीमाएं) हैं, हालांकि।

This stackoverflow question सुंदर प्रिंट xml करने के लिए और अधिक या कम hacky समाधान के साथ कई जवाब है, और मुझे लगता है कि आप अपनी आवश्यकताओं के अनुसार कम से कम regexp आधारित जवाब मॉडल सकता है।

Fredrik Lundh (ElementTree प्रसिद्धि) के पास printing xml के लिए बहुत कम स्तर का विवरण है, जिसे आप न्यूलाइन और इंडेंट विशेषताओं में भी अनुकूलित कर सकते हैं।