উত্তর:
import xml.dom.minidom
dom = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = dom.toprettyxml()
lxML সাম্প্রতিক, আপডেট হয়েছে এবং এতে একটি সুন্দর মুদ্রণ ফাংশন অন্তর্ভুক্ত রয়েছে
import lxml.etree as etree
x = etree.parse("filename")
print etree.tostring(x, pretty_print=True)
LxML টিউটোরিয়ালটি দেখুন: http://lxML.de/tutorial.html
aptitude install
দূরে। ওএস / এক্স এর অধীনে আমি নিশ্চিত নই।
print(etree.tostring(x, pretty_print=True, encoding="unicode"))
। একটি আউটপুট ফাইলে লেখার জন্য কেবল একটি লাইনেই সম্ভব, কোনও মধ্যস্থতাকার ভেরিয়েবলের প্রয়োজন নেই:etree.parse("filename").write("outputfile", encoding="utf-8")
আরেকটি সমাধান হ'ল এই 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)
tree.write([filename])
ফাইল লেখার জন্য এখনও করতে পারেন ( tree
এলিমেট্রি উদাহরণ হিসাবে)।
tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
কুরুচিপূর্ণ টেক্সট নোড সমস্যাটি পেতে আমার (হ্যাকি?) সমাধানটি এখানে।
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()
...)
অন্যরা দেখিয়েছে যে, 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')
বিউটিফুল সোপ ব্যবহার করা সহজ prettify()
পদ্ধতি আছে।
এটি প্রতি ইনডেন্টেশন স্তরের এক স্থান অন্তর্ভুক্ত করে। এটি lxML এর সুন্দর_প্রিন্টের চেয়ে অনেক ভাল কাজ করে এবং স্বল্প এবং মিষ্টি।
from bs4 import BeautifulSoup
bs = BeautifulSoup(open(xml_file), 'xml')
print bs.prettify()
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
আপনার যদি থাকে তবে আপনি 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))
আমি উপরে "এডি" এর উত্তর সম্পাদনা করার চেষ্টা করেছি, তবে প্রাথমিকভাবে বেনামে প্রতিক্রিয়া দেওয়ার পরে স্ট্যাক ওভারফ্লো আমাকে সম্পাদনা করতে দেয় না। এটি একটি এলিমেট্রি প্রিন্ট করার জন্য এটি ফাংশনের একটি কম বগি সংস্করণ।
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 += ' '
আপনি যদি ডিওএম বাস্তবায়ন ব্যবহার করেন তবে প্রত্যেকের নিজস্ব বিল্ট ইন প্রিন্টিং-প্রিন্টিংয়ের নিজস্ব ফর্ম রয়েছে:
# 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 প্রিটি-প্রিন্টারগুলি আপনার পছন্দ মতো এটি পুরোপুরি না করে - আপনার সম্ভবত নিজের সিরিয়াল লিখতে বা সাবক্লাস করতে হবে।
মিনিডমের সুন্দর মুদ্রণ নিয়ে আমার কিছু সমস্যা ছিল। আমি যখনই আমি প্রদত্ত এনকোডিংয়ের বাইরে অক্ষরগুলি সহ একটি দস্তাবেজ সুন্দর-মুদ্রণের চেষ্টা করি, তখন আমি একটি ইউনিকোডেরর পেতে পারি, যেমন যদি আমার কোনও নথিতে β থাকে এবং আমি চেষ্টা করি 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')
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 হোমপেজে রয়েছে।
আমি বিদ্যমান এলিমেন্টটি গাছের মধ্য দিয়ে চলার জন্য একটি সমাধান লিখেছি এবং পাঠ্য / লেজটিকে সাধারণত প্রত্যাশা হিসাবে ইন্ডেন্ট করতে ব্যবহার করি।
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
অজগর জন্য এক্সএমএল সুন্দর মুদ্রণ এই কাজের জন্য বেশ ভাল দেখাচ্ছে। (যথাযথভাবে নামকরণও করা হয়েছে))
একটি বিকল্প হ'ল পাইকএমএল ব্যবহার করা , এতে একটি প্রিন্টি প্রিন্ট ফাংশন রয়েছে ।
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
মনে করুন যে প্রকল্পটি আজকাল অ্যাটিকের মধ্যে রয়েছে, লজ্জাজনক।
এখানে একটি পাইথন 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)
আমি এখানে সাধারণ নিউলাইন সমস্যাটি কীভাবে ঠিক করতে পারি তা খুঁজে পেয়েছি ।
আপনি জনপ্রিয় বহিরাগত গ্রন্থাগার ব্যবহার করতে পারেন 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"?>
শীর্ষে বিরুদ্ধে ।
কটাক্ষপাত 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')
একটি বিকল্প যদি আপনি পুনঃস্থাপন করতে না চান তবে ফাংশন সহ xMLpp.py লাইব্রেরি রয়েছে get_pprint()
। এটি কোনও এক্সএক্সএমএল এলিমেন্ট্রি ট্রি অবজেক্টের পুনরাবৃত্তি না করে আমার ব্যবহারের ক্ষেত্রে খুব সুন্দর এবং সাবলীলভাবে কাজ করেছে।
আপনি এই প্রকরণটি চেষ্টা করতে পারেন ...
ইনস্টল করুন 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())
'lxml'
ব্যবহারসমূহ lxml এর এইচটিএমএল পার্সার - BS4 দেখতে ডক্স । আপনার প্রয়োজন 'xml'
বা 'lxml-xml'
এক্সএমএল পার্সারের জন্য।
lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
) নিয়ে টেম্পার করেছে এবং তারপরে তারা সেদিনই এটিকে ডাউনটাতে অগ্রসর করেছিল। আমি এস / ও-তে একটি অফিসিয়াল অভিযোগ জমা দিয়েছি কিন্তু তারা তদন্ত করতে অস্বীকার করেছেন। যাইহোক, আমার উত্তরটির পরে আমার "ডি-টেম্পারড" হয়েছে, যা এখন আবার সঠিক (এবং lxml-xml
এটি মূলত যেমনটি উল্লেখ করেছে)। ধন্যবাদ.
আমি এই সমস্যাটি পেয়েছি এবং এটি এর মতো সমাধান করেছি:
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
ইনডেন্টের জন্য ব্যবহার করে, যা আমি ইন্ডেন্টেশনের উপর জোর দেওয়া খুব বেশি খুঁজে পাই না এবং তাই সুন্দরও না। স্ট্যান্ডার্ড ইন্ট্রি ইনডেন্ট পরিবর্তন করতে কোনও ফাংশনের জন্য আমি ইন্ট্রি বা প্যারামিটারের জন্য কোনও সেটিংস আনতে পারি না। আমি এট্রি ব্যবহার করা কতটা সহজ তা পছন্দ করি তবে এটি আমাকে বিরক্ত করেছিল।
পুরো এক্সএমএল ডকুমেন্টকে একটি চমত্কার এক্সএমএল ডকুমেন্টে রূপান্তর করার জন্য (উদাহরণস্বরূপ
: ধরে নেওয়া যাক আপনি একটি লিবারঅফিস লেখক .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()
তথ্যসূত্র:
- এই পৃষ্ঠায় বেন নোল্যান্ডের জবাবের জন্য ধন্যবাদ যা আমাকে সেখানকার বেশিরভাগ ক্ষেত্রে পেয়েছে।
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=' ',))
এটি চীনা সহ এক্সএমএল জন্য ভাল কাজ করছে!
যদি কোনও কারণে আপনি অন্যান্য ব্যবহারকারীরা উল্লিখিত পাইথন মডিউলগুলির কোনওটিতে হাত পেতে না পারেন তবে আমি পাইথন ২.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
প্যাকেজ ইনস্টল করা আছে।
check_output
কারণ আপনার ত্রুটি পরীক্ষা করার দরকার নেই
আমি কোডের কয়েকটি লাইন দিয়ে এটি সমাধান করেছি, ফাইলটি খোলছি, এটি গর্তে যাচ্ছি এবং ইন্ডেন্টেশন যুক্ত করব, তারপরে আবার এটি সংরক্ষণ করব। আমি ছোট 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()
এটি আমার পক্ষে কাজ করে, সম্ভবত কারওর এটির কিছুটা ব্যবহার থাকবে :)