পাইথনে প্রিন্টিং প্রিন্টিং এক্সএমএল


424

পাইথনের এক্সএমএল প্রিন্ট করার সর্বোত্তম উপায় (বা বিভিন্ন উপায়) কী?

উত্তর:


379
import xml.dom.minidom

dom = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = dom.toprettyxml()

35
এটি আপনাকে চমত্কার এক্সএমএল পাবে, তবে নোট করুন যে পাঠ্য নোডে যা প্রকাশিত হবে তা আসলে যা এসেছে তার চেয়ে আলাদা - পাঠ্য নোডগুলিতে নতুন সাদা স্থান রয়েছে। যদি আপনি ঠিক কী খাওয়াতে খাওয়ানোর আশা করছেন তবে এটি আপনাকে সমস্যার কারণ হতে পারে।
টড হপকিনসন

49
@ আইসিএনভিড: যদিও এই সত্যটি উল্লেখ করা গুরুত্বপূর্ণ, তবে আমার কাছে এটি আশ্চর্যের বিষয় বলে মনে হচ্ছে যে স্পেসগুলি যদি তাদের জন্য কিছুটা গুরুত্ব দেয় তবে কেউ তার এক্সএমএলকে সুন্দর করে তুলতে চাইবে!
vaab

18
নিস! এটি এক লাইনারে ভেঙে ফেলতে পারে: পাইথন -c 'আমদানি sys; আমদানি xml.dom.minidom; s = sys.stdin.read (); প্রিন্ট xml.dom.minidom.parseString (গুলি) .tretrettyxml ()'
আন্তন আই সিপোস

11
মিনিডম একটি দুর্দান্ত খারাপ এক্সএমএল বাস্তবায়ন হিসাবে ব্যাপকভাবে প্যান করা হয়। আপনি যদি নিজেকে বাহ্যিক অবক্ষয় যোগ করার অনুমতি দেন তবে lxML আরও উন্নত।
বুকজোর

26
এক্সএমএলকে মডিউল থেকে আউটপুট অবজেক্টে রূপান্তর করার ভক্ত নয়, তবে অন্যথায় পদ্ধতিটি কাজ করে। আমি কোর এট্রি থেকে চমত্কার মুদ্রণের দিকে যাওয়ার সুন্দর উপায় খুঁজে পেতে চাই যখন lxML শীতল হয়, এমন সময় আসে যখন আমি পারি যদি আমি কোরকে রাখতে পছন্দ করি।
ড্যানি স্ট্যাপল

162

lxML সাম্প্রতিক, আপডেট হয়েছে এবং এতে একটি সুন্দর মুদ্রণ ফাংশন অন্তর্ভুক্ত রয়েছে

import lxml.etree as etree

x = etree.parse("filename")
print etree.tostring(x, pretty_print=True)

LxML টিউটোরিয়ালটি দেখুন: http://lxML.de/tutorial.html


11
বাইরের লাইব্রেরিগুলিতে নির্ভরতা কেবলমাত্র lxML এ। এটি আমার মনে হয় উইন্ডোজের অধীনে লাইব্রেরিগুলি মডিউল সহ প্যাকেজ করা থাকে। লিনাক্সের নীচে তারা aptitude installদূরে। ওএস / এক্স এর অধীনে আমি নিশ্চিত নই।
intuited

4
ওএস এক্সে আপনার কেবলমাত্র একটি কার্যনির্বাহী জিসিসি এবং ইজি_সিন্টল / পিপ দরকার।
pkoch

11
lxml চমত্কার প্রিন্টার নির্ভরযোগ্য নয় এবং সুন্দর ব্যাখ্যা মামলা প্রচুর মধ্যে সঠিকভাবে আপনার XML প্রিন্ট করা হবে না lxml প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী । আমি বেশ কয়েকটি কোণার মামলার পরে প্রিন্টিং প্রিন্টিংয়ের জন্য lxML ব্যবহার করা ছেড়ে দিয়েছি যা কেবল কাজ করে না (যেমন এটি ঠিক করবে না: বাগ # 910018 )। এই সমস্ত সমস্যাটি সংরক্ষণ করা উচিত এমন স্থানগুলি থাকা এক্সএমএল মানগুলির ব্যবহারের সাথে সম্পর্কিত।
vaab

1
lxML এছাড়াও ম্যাকপোর্টের অংশ, আমার জন্য সুচারুভাবে কাজ করে।
জেনস

14
যেহেতু পাইথন 3 আপনি সাধারণত Str (= পাইথন 2 ইউনিকোড STRING) সাথে কাজ করতে চান, ভাল ব্যবহার করুন, print(etree.tostring(x, pretty_print=True, encoding="unicode"))। একটি আউটপুট ফাইলে লেখার জন্য কেবল একটি লাইনেই সম্ভব, কোনও মধ্যস্থতাকার ভেরিয়েবলের প্রয়োজন নেই:etree.parse("filename").write("outputfile", encoding="utf-8")
Thor

109

আরেকটি সমাধান হ'ল এই indentফাংশনটি ধার করা , এটি এলিমেন্ট্রি লাইব্রেরির সাথে ব্যবহার করার জন্য যা পাইথনে 2.5 থেকে তৈরি। যা দেখতে দেখতে এটি এখানে:

from xml.etree import ElementTree

def indent(elem, level=0):
    i = "\n" + level*"  "
    j = "\n" + (level-1)*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for subelem in elem:
            indent(subelem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = j
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = j
    return elem        

root = ElementTree.parse('/tmp/xmlfile').getroot()
indent(root)
ElementTree.dump(root)

... এবং তারপরে কেবল lxML টস্ট্রিং ব্যবহার করুন!
স্টেফানো

2
নোট করুন যে আপনি tree.write([filename])ফাইল লেখার জন্য এখনও করতে পারেন ( treeএলিমেট্রি উদাহরণ হিসাবে)।
বুকে

16
এই লিঙ্কটি effbot.org/zone/element-lib.htm# ব্যাখ্যাপ্রিন্টের সঠিক কোড রয়েছে। এখানে কোড কিছু ভুল আছে। সম্পাদনা করা দরকার।
আইলউইন লেক

না আপনি যেহেতু এলিমেন্ট্রি ডটগ্রেট () এর সেই পদ্ধতি নেই, কেবলমাত্র একটি উপাদান উপাদান থাকতে পারে। @ বুউক
শিনজু

1
আপনি কীভাবে কোনও ফাইলে লিখতে পারেন তা এখানে:tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
ই-মালিটো

47

কুরুচিপূর্ণ টেক্সট নোড সমস্যাটি পেতে আমার (হ্যাকি?) সমাধানটি এখানে।

uglyXml = doc.toprettyxml(indent='  ')

text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)    
prettyXml = text_re.sub('>\g<1></', uglyXml)

print prettyXml

উপরের কোডটি উত্পাদন করবে:

<?xml version="1.0" ?>
<issues>
  <issue>
    <id>1</id>
    <title>Add Visual Studio 2005 and 2008 solution files</title>
    <details>We need Visual Studio 2005/2008 project files for Windows.</details>
  </issue>
</issues>

এর পরিবর্তে:

<?xml version="1.0" ?>
<issues>
  <issue>
    <id>
      1
    </id>
    <title>
      Add Visual Studio 2005 and 2008 solution files
    </title>
    <details>
      We need Visual Studio 2005/2008 project files for Windows.
    </details>
  </issue>
</issues>

অস্বীকৃতি: সম্ভবত কিছু সীমাবদ্ধতা রয়েছে।


ধন্যবাদ! এটি সমস্ত সুন্দর মুদ্রণের পদ্ধতিগুলির সাথে আমার এক গ্রিপ। আমি চেষ্টা করা কয়েকটি ফাইলের সাথে ভাল কাজ করে।
আয়নো

আমি একটি চমত্কার 'প্রায় অভিন্ন' সমাধান পেয়েছি, তবে আপনার পরিচালনা আরও কার্যকর, অপারেশন re.compileকরার আগে ব্যবহার subকরে (আমি re.findall()দুবার ব্যবহার করছিলাম , zipএবং এর সাথে একটি forলুপ str.replace()...)
হেলটনবাইকার

3
পাইথন ২.7 এ আর দরকার নেই: xml.dom.minidom এর টপ্রেটিএক্সএমএল () এখন ডিফল্টরূপে <<id> 1 </id> 'এর মতো আউটপুট তৈরি করে, ঠিক যে পাঠ্য চাইল্ড নোড রয়েছে সেই নোডের জন্য।
মারিয়াস গেডমিনাস

আমি পাইথন ২.6 ব্যবহার করতে বাধ্য। সুতরাং, এই রেজেক্স পুনর্নির্মাণ কৌশল খুব দরকারী। যেমন সমস্যা হয়েছে তেমন কাজ করেছেন।
মাইক ফিঞ্চ

@ মারিয়াস গেডমিনাস আমি ২.7.২ চালিয়ে যাচ্ছি এবং "ডিফল্ট" অবশ্যই আপনার কথা মতো নয়।
posfan12

23

অন্যরা দেখিয়েছে যে, lxML এর মধ্যে একটি প্রিন্টর অন্তর্নির্মিত রয়েছে।

সচেতন থাকুন যদিও ডিফল্টরূপে এটি সিডিএটিএ বিভাগগুলি সাধারণ পাঠ্যে পরিবর্তিত করে, এতে বাজে ফলাফল হতে পারে।

এখানে একটি পাইথন ফাংশন রয়েছে যা ইনপুট ফাইল সংরক্ষণ করে এবং কেবল ইনডেন্টেশন পরিবর্তন করে (লক্ষ্য করুন strip_cdata=False)। তবুও এটি নিশ্চিত করে যে আউটপুট ইউটিএফ -8 ডিফল্ট ASCII এর পরিবর্তে এনকোডিং হিসাবে ব্যবহার করেছে (লক্ষ্য করুন encoding='utf-8'):

from lxml import etree

def prettyPrintXml(xmlFilePathToPrettyPrint):
    assert xmlFilePathToPrettyPrint is not None
    parser = etree.XMLParser(resolve_entities=False, strip_cdata=False)
    document = etree.parse(xmlFilePathToPrettyPrint, parser)
    document.write(xmlFilePathToPrettyPrint, pretty_print=True, encoding='utf-8')

ব্যবহারের উদাহরণ:

prettyPrintXml('some_folder/some_file.xml')

1
এখন একটু দেরি হয়ে গেছে। তবে আমি মনে করি সিএডিএলএলএক্সএক্সএলএক্সএল? সিডিএটিএ আমার পক্ষে সিডিটিএ।
elwc

ধন্যবাদ, এটি এখন পর্যন্ত সেরা উত্তর।
জর্জ চালাহুব

20

বিউটিফুল সোপ ব্যবহার করা সহজ prettify() পদ্ধতি আছে।

এটি প্রতি ইনডেন্টেশন স্তরের এক স্থান অন্তর্ভুক্ত করে। এটি lxML এর সুন্দর_প্রিন্টের চেয়ে অনেক ভাল কাজ করে এবং স্বল্প এবং মিষ্টি।

from bs4 import BeautifulSoup

bs = BeautifulSoup(open(xml_file), 'xml')
print bs.prettify()

1
এই ত্রুটি বার্তাটি পাওয়া:bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
hadoop

12

আপনার যদি থাকে তবে আপনি xmllintএকটি সাবপ্রসেস স্প্যান করতে এবং এটি ব্যবহার করতে পারেন।xmllint --format <file>এটির ইনপুট এক্সএমএলকে স্ট্যান্ডার্ড আউটপুটে প্রিন্ট করে to

নোট করুন যে এই পদ্ধতিটি পাইথনের বাইরের একটি প্রোগ্রাম ব্যবহার করে যা এটি হ্যাককে সাজিয়ে তোলে।

def pretty_print_xml(xml):
    proc = subprocess.Popen(
        ['xmllint', '--format', '/dev/stdin'],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
    )
    (output, error_output) = proc.communicate(xml);
    return output

print(pretty_print_xml(data))

11

আমি উপরে "এডি" এর উত্তর সম্পাদনা করার চেষ্টা করেছি, তবে প্রাথমিকভাবে বেনামে প্রতিক্রিয়া দেওয়ার পরে স্ট্যাক ওভারফ্লো আমাকে সম্পাদনা করতে দেয় না। এটি একটি এলিমেট্রি প্রিন্ট করার জন্য এটি ফাংশনের একটি কম বগি সংস্করণ।

def indent(elem, level=0, more_sibs=False):
    i = "\n"
    if level:
        i += (level-1) * '  '
    num_kids = len(elem)
    if num_kids:
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
            if level:
                elem.text += '  '
        count = 0
        for kid in elem:
            indent(kid, level+1, count < num_kids - 1)
            count += 1
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
            if more_sibs:
                elem.tail += '  '
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i
            if more_sibs:
                elem.tail += '  '

8

আপনি যদি ডিওএম বাস্তবায়ন ব্যবহার করেন তবে প্রত্যেকের নিজস্ব বিল্ট ইন প্রিন্টিং-প্রিন্টিংয়ের নিজস্ব ফর্ম রয়েছে:

# minidom
#
document.toprettyxml()

# 4DOM
#
xml.dom.ext.PrettyPrint(document, stream)

# pxdom (or other DOM Level 3 LS-compliant imp)
#
serializer.domConfig.setParameter('format-pretty-print', True)
serializer.writeToString(document)

যদি আপনি তার নিজস্ব প্রিন্ট-প্রিন্টার ব্যতীত অন্য কোনও কিছু ব্যবহার করেন - বা pretty প্রিটি-প্রিন্টারগুলি আপনার পছন্দ মতো এটি পুরোপুরি না করে - আপনার সম্ভবত নিজের সিরিয়াল লিখতে বা সাবক্লাস করতে হবে।


6

মিনিডমের সুন্দর মুদ্রণ নিয়ে আমার কিছু সমস্যা ছিল। আমি যখনই আমি প্রদত্ত এনকোডিংয়ের বাইরে অক্ষরগুলি সহ একটি দস্তাবেজ সুন্দর-মুদ্রণের চেষ্টা করি, তখন আমি একটি ইউনিকোডেরর পেতে পারি, যেমন যদি আমার কোনও নথিতে β থাকে এবং আমি চেষ্টা করি doc.toprettyxml(encoding='latin-1')। এটির জন্য আমার কার্যকারিতা এখানে:

def toprettyxml(doc, encoding):
    """Return a pretty-printed XML document in a given encoding."""
    unistr = doc.toprettyxml().replace(u'<?xml version="1.0" ?>',
                          u'<?xml version="1.0" encoding="%s"?>' % encoding)
    return unistr.encode(encoding, 'xmlcharrefreplace')

5
from yattag import indent

pretty_string = indent(ugly_string)

এটি পাঠ্য নোডের ভিতরে ফাঁকা স্থান বা নিউলাইন যুক্ত করবে না, যদি না আপনি এটি দিয়ে জিজ্ঞাসা করেন:

indent(mystring, indent_text = True)

ইন্ডেন্টেশন ইউনিটটি কী হওয়া উচিত এবং নিউলাইনটি কেমন হওয়া উচিত তা আপনি নির্দিষ্ট করতে পারেন।

pretty_xml_string = indent(
    ugly_xml_string,
    indentation = '    ',
    newline = '\r\n'
)

দস্তাবেজটি http://www.yattag.org হোমপেজে রয়েছে।


4

আমি বিদ্যমান এলিমেন্টটি গাছের মধ্য দিয়ে চলার জন্য একটি সমাধান লিখেছি এবং পাঠ্য / লেজটিকে সাধারণত প্রত্যাশা হিসাবে ইন্ডেন্ট করতে ব্যবহার করি।

def prettify(element, indent='  '):
    queue = [(0, element)]  # (level, element)
    while queue:
        level, element = queue.pop(0)
        children = [(level + 1, child) for child in list(element)]
        if children:
            element.text = '\n' + indent * (level+1)  # for child open
        if queue:
            element.tail = '\n' + indent * queue[0][0]  # for sibling open
        else:
            element.tail = '\n' + indent * (level-1)  # for parent close
        queue[0:0] = children  # prepend so children come before siblings

3

অজগর জন্য এক্সএমএল সুন্দর মুদ্রণ এই কাজের জন্য বেশ ভাল দেখাচ্ছে। (যথাযথভাবে নামকরণও করা হয়েছে))

একটি বিকল্প হ'ল পাইকএমএল ব্যবহার করা , এতে একটি প্রিন্টি প্রিন্ট ফাংশন রয়েছে


HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/মনে করুন যে প্রকল্পটি আজকাল অ্যাটিকের মধ্যে রয়েছে, লজ্জাজনক।
বিটজুঙ্কি

3

এখানে একটি পাইথন 3 সমাধান রয়েছে যা কুৎসিত নতুন লাইনের ইস্যু (টন হোয়াইটস্পেস) থেকে মুক্তি পেয়েছে এবং এটি অন্যান্য বেশিরভাগ বাস্তবায়নের বিপরীতে কেবলমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে।

import xml.etree.ElementTree as ET
import xml.dom.minidom
import os

def pretty_print_xml_given_root(root, output_xml):
    """
    Useful for when you are editing xml data on the fly
    """
    xml_string = xml.dom.minidom.parseString(ET.tostring(root)).toprettyxml()
    xml_string = os.linesep.join([s for s in xml_string.splitlines() if s.strip()]) # remove the weird newline issue
    with open(output_xml, "w") as file_out:
        file_out.write(xml_string)

def pretty_print_xml_given_file(input_xml, output_xml):
    """
    Useful for when you want to reformat an already existing xml file
    """
    tree = ET.parse(input_xml)
    root = tree.getroot()
    pretty_print_xml_given_root(root, output_xml)

আমি এখানে সাধারণ নিউলাইন সমস্যাটি কীভাবে ঠিক করতে পারি তা খুঁজে পেয়েছি ।


2

আপনি জনপ্রিয় বহিরাগত গ্রন্থাগার ব্যবহার করতে পারেন xmltodict সঙ্গে, unparseএবং pretty=Trueআপনি সেরা ফলাফল পেতে হবে:

xmltodict.unparse(
    xmltodict.parse(my_xml), full_document=False, pretty=True)

full_document=False<?xml version="1.0" encoding="UTF-8"?>শীর্ষে বিরুদ্ধে ।


2

কটাক্ষপাত vkbeautify মডিউল।

এটি একই নামে আমার খুব জনপ্রিয় জাভাস্ক্রিপ্ট / নোডেজ প্লাগইনের একটি অজগর সংস্করণ। এটি এক্সএমএল, জেএসওএন এবং সিএসএস পাঠ্যকে প্রিন্ট / মুদ্রণ করতে পারে। ইনপুট এবং আউটপুট যে কোনও সংমিশ্রণে স্ট্রিং / ফাইল হতে পারে। এটি খুব কমপ্যাক্ট এবং কোনও নির্ভরতা নেই।

উদাহরণ :

import vkbeautify as vkb

vkb.xml(text)                       
vkb.xml(text, 'path/to/dest/file')  
vkb.xml('path/to/src/file')        
vkb.xml('path/to/src/file', 'path/to/dest/file') 

এই নির্দিষ্ট গ্রন্থাগারটি কুশলী পাঠ নোড সমস্যা পরিচালনা করে।
ক্যামেরন লোয়েল পামার

1

একটি বিকল্প যদি আপনি পুনঃস্থাপন করতে না চান তবে ফাংশন সহ xMLpp.py লাইব্রেরি রয়েছে get_pprint()। এটি কোনও এক্সএক্সএমএল এলিমেন্ট্রি ট্রি অবজেক্টের পুনরাবৃত্তি না করে আমার ব্যবহারের ক্ষেত্রে খুব সুন্দর এবং সাবলীলভাবে কাজ করেছে।


1
মিনিডোম এবং এলএক্সএমএল চেষ্টা করে দেখেছেন এবং সঠিকভাবে ফর্ম্যাট এবং ইন্টেন্টেড এক্সএমএল পান নি। এটি প্রত্যাশার মতো কাজ করেছে
ডেভিড-হোজে

1
নামের জায়গাগুলির নামের সাথে পূর্ববর্তী এবং এমন একটি হাইফেন ধারণ করে এমন ট্যাগের নামের ব্যর্থতা (যেমন <এনএস: হাইফেনেটেড-ট্যাগ />; হাইফেন দিয়ে শুরু হওয়া অংশটি কেবল সরানো হয়, যেমন <এনএস: হাইফেনেটেড />
এন্ড্রে উভয়

@ ইন্ড্রেবোথ ভাল ধরা, আমি পরীক্ষা করিনি, তবে xMLpp.py কোডে এটি ঠিক করা সহজ হবে কি?
চমত্কার

1

আপনি এই প্রকরণটি চেষ্টা করতে পারেন ...

ইনস্টল করুন BeautifulSoupএবং ব্যাকএন্ড lxml(পার্সার) লাইব্রেরি:

user$ pip3 install lxml bs4

আপনার এক্সএমএল ডকুমেন্টটি প্রক্রিয়া করুন:

from bs4 import BeautifulSoup

with open('/path/to/file.xml', 'r') as doc: 
    for line in doc: 
        print(BeautifulSoup(line, 'lxml-xml').prettify())  

1
'lxml'ব্যবহারসমূহ lxml এর এইচটিএমএল পার্সার - BS4 দেখতে ডক্স । আপনার প্রয়োজন 'xml'বা 'lxml-xml'এক্সএমএল পার্সারের জন্য।
ব্যবহারকারী 2357112 মনিকা

1
এই মন্তব্য মুছে ফেলা হচ্ছে। আবার, আমি স্ট্যাকওভারফ্লোতে পোস্ট টেম্পারিংয়ের একটি আনুষ্ঠানিক অভিযোগ (4-পতাকা ছাড়াও) লিখেছি এবং এটি কোনও সুরক্ষা দল (অ্যাক্সেস লগ এবং সংস্করণ ইতিহাস) দ্বারা তাত্ক্ষণিকভাবে তদন্ত না করা অবধি থামবে না। উপরের টাইমস্ট্যাম্পটি ভুল (বছর দ্বারা) এবং সম্ভবত সামগ্রীটিও।
এনওয়াইসিজেস

1
এটি আমার পক্ষে ভাল কাজ করেছে, ডক্স থেকে ডাউন ভোটের বিষয়ে অনিশ্চিতlxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
দাতানোভিস

1
@ দাতানোভিস আমি আপনাকে খুশি করে আনন্দিত। :) সন্দেহজনক ডাউনটোটের কথা হিসাবে, কেউ আমার আসল উত্তরের (যা সঠিকভাবে মূলত নির্দিষ্ট করে lxml-xml) নিয়ে টেম্পার করেছে এবং তারপরে তারা সেদিনই এটিকে ডাউনটাতে অগ্রসর করেছিল। আমি এস / ও-তে একটি অফিসিয়াল অভিযোগ জমা দিয়েছি কিন্তু তারা তদন্ত করতে অস্বীকার করেছেন। যাইহোক, আমার উত্তরটির পরে আমার "ডি-টেম্পারড" হয়েছে, যা এখন আবার সঠিক (এবং lxml-xmlএটি মূলত যেমনটি উল্লেখ করেছে)। ধন্যবাদ.
এনওয়াইচিস

0

আমি এই সমস্যাটি পেয়েছি এবং এটি এর মতো সমাধান করেছি:

def write_xml_file (self, file, xml_root_element, xml_declaration=False, pretty_print=False, encoding='unicode', indent='\t'):
    pretty_printed_xml = etree.tostring(xml_root_element, xml_declaration=xml_declaration, pretty_print=pretty_print, encoding=encoding)
    if pretty_print: pretty_printed_xml = pretty_printed_xml.replace('  ', indent)
    file.write(pretty_printed_xml)

আমার কোডে এই পদ্ধতিটিকে এভাবে বলা হয়:

try:
    with open(file_path, 'w') as file:
        file.write('<?xml version="1.0" encoding="utf-8" ?>')

        # create some xml content using etree ...

        xml_parser = XMLParser()
        xml_parser.write_xml_file(file, xml_root, xml_declaration=False, pretty_print=True, encoding='unicode', indent='\t')

except IOError:
    print("Error while writing in log file!")

এটি কেবলমাত্র কাজ করে কারণ ডিফল্টরূপে এন্ট্রি two spacesইনডেন্টের জন্য ব্যবহার করে, যা আমি ইন্ডেন্টেশনের উপর জোর দেওয়া খুব বেশি খুঁজে পাই না এবং তাই সুন্দরও না। স্ট্যান্ডার্ড ইন্ট্রি ইনডেন্ট পরিবর্তন করতে কোনও ফাংশনের জন্য আমি ইন্ট্রি বা প্যারামিটারের জন্য কোনও সেটিংস আনতে পারি না। আমি এট্রি ব্যবহার করা কতটা সহজ তা পছন্দ করি তবে এটি আমাকে বিরক্ত করেছিল।


0

পুরো এক্সএমএল ডকুমেন্টকে একটি চমত্কার এক্সএমএল ডকুমেন্টে রূপান্তর করার জন্য (উদাহরণস্বরূপ
: ধরে নেওয়া যাক আপনি একটি লিবারঅফিস লেখক .odt বা .ods ফাইলটি বের করেছেন [আনজিপড], এবং আপনি কুৎসিত "কন্টেন্ট.এক্সএমএল" ফাইলটিকে একটি সুন্দর রূপে রূপান্তর করতে চান স্বয়ংক্রিয় Git সংস্করণ নিয়ন্ত্রণ এবং git difftool.odt এর ing / .ods ফাইল যেমন আমি বাস্তবায়ন করছি এখানে )

import xml.dom.minidom

file = open("./content.xml", 'r')
xml_string = file.read()
file.close()

parsed_xml = xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = parsed_xml.toprettyxml()

file = open("./content_new.xml", 'w')
file.write(pretty_xml_as_string)
file.close()

তথ্যসূত্র:
- এই পৃষ্ঠায় বেন নোল্যান্ডের জবাবের জন্য ধন্যবাদ যা আমাকে সেখানকার বেশিরভাগ ক্ষেত্রে পেয়েছে।


0
from lxml import etree
import xml.dom.minidom as mmd

xml_root = etree.parse(xml_fiel_path, etree.XMLParser())

def print_xml(xml_root):
    plain_xml = etree.tostring(xml_root).decode('utf-8')
    urgly_xml = ''.join(plain_xml .split())
    good_xml = mmd.parseString(urgly_xml)
    print(good_xml.toprettyxml(indent='    ',))

এটি চীনা সহ এক্সএমএল জন্য ভাল কাজ করছে!


0

যদি কোনও কারণে আপনি অন্যান্য ব্যবহারকারীরা উল্লিখিত পাইথন মডিউলগুলির কোনওটিতে হাত পেতে না পারেন তবে আমি পাইথন ২.7 এর জন্য নিম্নলিখিত সমাধানটি প্রস্তাব করছি:

import subprocess

def makePretty(filepath):
  cmd = "xmllint --format " + filepath
  prettyXML = subprocess.check_output(cmd, shell = True)
  with open(filepath, "w") as outfile:
    outfile.write(prettyXML)

আমি যতদূর জানি, এই সমাধানটি ইউনিক্স-ভিত্তিক সিস্টেমে কাজ করবে যেগুলি xmllintপ্যাকেজ ইনস্টল করা আছে।


: xmllint ইতিমধ্যেই অন্য উত্তরে বলা হয়েছে stackoverflow.com/a/10133365/407651
mzjn

@ এমজেজেএন আমি উত্তরটি দেখেছি, তবে আমি আমার এটিকে সহজ করে দিয়েছি check_outputকারণ আপনার ত্রুটি পরীক্ষা করার দরকার নেই
শুক্রবার স্কাই

-1

আমি কোডের কয়েকটি লাইন দিয়ে এটি সমাধান করেছি, ফাইলটি খোলছি, এটি গর্তে যাচ্ছি এবং ইন্ডেন্টেশন যুক্ত করব, তারপরে আবার এটি সংরক্ষণ করব। আমি ছোট xML ফাইলগুলির সাথে কাজ করছিলাম, এবং ব্যবহারকারীর জন্য ইনস্টল করতে নির্ভরতা, বা আরও লাইব্রেরি যুক্ত করতে চাই নি। যাইহোক, এখানেই আমি শেষ করেছি:

    f = open(file_name,'r')
    xml = f.read()
    f.close()

    #Removing old indendations
    raw_xml = ''        
    for line in xml:
        raw_xml += line

    xml = raw_xml

    new_xml = ''
    indent = '    '
    deepness = 0

    for i in range((len(xml))):

        new_xml += xml[i]   
        if(i<len(xml)-3):

            simpleSplit = xml[i:(i+2)] == '><'
            advancSplit = xml[i:(i+3)] == '></'        
            end = xml[i:(i+2)] == '/>'    
            start = xml[i] == '<'

            if(advancSplit):
                deepness += -1
                new_xml += '\n' + indent*deepness
                simpleSplit = False
                deepness += -1
            if(simpleSplit):
                new_xml += '\n' + indent*deepness
            if(start):
                deepness += 1
            if(end):
                deepness += -1

    f = open(file_name,'w')
    f.write(new_xml)
    f.close()

এটি আমার পক্ষে কাজ করে, সম্ভবত কারওর এটির কিছুটা ব্যবহার থাকবে :)


এর আগে এবং পরে একটি স্নিপেট স্ক্রিনশট দেখান এবং সম্ভবত আপনি ভবিষ্যতের উঁচু স্থানগুলি এড়াতে পারেন। আমি আপনার কোডটি ব্যবহার করে দেখিনি, এবং স্পষ্টতই এখানে অন্য উত্তরগুলি আমার পক্ষে আরও ভাল (এবং আরও সাধারণ / সম্পূর্ণরূপে গঠিত, যেহেতু তারা দুর্দান্ত লাইব্রেরিতে নির্ভর করে) তবে কেন আপনি এখানে ডাউন ডাউন পেয়েছেন তা নিশ্চিত নই। লোকেদের ডাউনভোট করার সময় লোকদের একটি মন্তব্য করা উচিত।
গ্যাব্রিয়েল স্টেপলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.