พริตตี้การพิมพ์ XML ใน Python


คำตอบ:


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
สิ่งนี้จะทำให้คุณได้รับ xml ที่สวยงาม แต่โปรดทราบว่าสิ่งที่ออกมาในโหนดข้อความนั้นแตกต่างจากที่เป็นจริงมากขึ้น - มี whitespaces ใหม่บนโหนดข้อความ สิ่งนี้อาจทำให้คุณเดือดร้อนหากคุณคาดหวังถึงสิ่งที่ถูกป้อนเข้ามา
Todd Hopkinson

49
@icnivad: ในขณะที่มันเป็นสิ่งสำคัญที่จะชี้ให้เห็นความจริงที่ว่ามันแปลกสำหรับฉันที่ใครบางคนต้องการที่จะ prettify XML ของมันถ้าช่องว่างมีความสำคัญสำหรับพวกเขา!
vaab

18
ดี! สามารถยุบสิ่งนี้ให้เป็นหนึ่งซับ: python -c 'import sys; import xml.dom.minidom; s = sys.stdin.read (); print xml.dom.minidom.parseString (s) .toprettyxml ()'
Anton I. Sipos

11
minidom ถูกแพนอย่างกว้างขวางว่าเป็นการนำ xml ไปใช้งานได้ไม่ดีนัก หากคุณอนุญาตให้เพิ่มการพึ่งพาภายนอก lxml นั้นเหนือกว่ามาก
bukzor

26
ไม่ใช่แฟนของการนิยาม xml ใหม่จากการเป็นโมดูลไปยังวัตถุเอาต์พุต แต่วิธีการนี้ใช้งานได้ ฉันชอบที่จะหาวิธีที่ดีกว่าที่จะไปจากแกนหลักในการพิมพ์ที่สวยงาม ในขณะที่ lxml เจ๋งมีอยู่หลายครั้งที่ฉันอยากจะเก็บไว้ในใจถ้าฉันทำได้
Danny Staple

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 เท่านั้นคือการพึ่งพาไลบรารีภายนอก สิ่งนี้ฉันคิดว่าไม่เลวใน Windows ห้องสมุดต่างๆจะบรรจุด้วยโมดูล ภายใต้ลินุกซ์พวกเขาอยู่aptitude installห่าง ภายใต้ OS / X ฉันไม่แน่ใจ
intuited

4
บน OS X คุณต้องมี gcc ที่ใช้งานได้และ easy_install / pip
pkoch

11
lxml เครื่องพิมพ์สวยไม่น่าเชื่อถือและจะไม่สวยพิมพ์ XML ของคุณอย่างถูกต้องในหลายกรณีที่อธิบายไว้ในlxml คำถามที่พบบ่อย ฉันเลิกใช้ lxml เพื่อพิมพ์สวย ๆ หลังจากหลายมุมที่ไม่ทำงาน (เช่นนี้จะไม่แก้ไข: Bug # 910018 ) ปัญหาทั้งหมดนี้เกี่ยวข้องกับการใช้ค่า XML ที่มีช่องว่างที่ควรรักษาไว้
vaab

1
lxml ยังเป็นส่วนหนึ่งของ MacPorts ทำงานได้อย่างราบรื่นสำหรับฉัน
Jens

14
เนื่องจากในหลาม 3 ที่คุณมักจะต้องการที่จะทำงานร่วมกับ STR (= สตริง Unicode ในหลาม 2) print(etree.tostring(x, pretty_print=True, encoding="unicode"))ดีกว่าใช้นี้ การเขียนไปยังไฟล์ที่ส่งออกเป็นไปได้ในเวลาเพียงหนึ่งเส้นไม่มีตัวแปรตัวกลางที่ต้องการ:etree.parse("filename").write("outputfile", encoding="utf-8")
ธ อร์

109

อีกวิธีหนึ่งคือยืมฟังก์ชันนี้indentเพื่อใช้กับไลบรารี่ ElementTree ที่ติดตั้งไว้ใน Python ตั้งแต่ 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 tostring!
Stefano

2
โปรดทราบว่าคุณยังสามารถtree.write([filename])เขียนไฟล์ได้ ( treeเป็นอินสแตนซ์ ElementTree)
Bouke

16
ลิงค์นี้effbot.org/zone/element-lib.htm#prettyprintมีรหัสที่ถูกต้อง รหัสที่นี่มีบางอย่างผิดปกติ ต้องมีการแก้ไข
ทะเลสาบ Aylwyn

ไม่คุณไม่สามารถทำได้ตั้งแต่ elementtree.getroot () ไม่มีวิธีการนี้มีเพียงวัตถุองค์ประกอบ elementtree เท่านั้น @bouke
shinzou

1
นี่คือวิธีที่คุณสามารถเขียนไฟล์:tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
e-malito

47

นี่เป็นวิธีแก้ปัญหาของฉัน (hacky?) เพื่อแก้ไขปัญหาโหนดข้อความที่น่าเกลียด

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>

คำเตือน:อาจมีข้อ จำกัด บางอย่าง


ขอบคุณ! นี่คือหนึ่งในความรู้สึกของฉันด้วยวิธีการพิมพ์ที่น่ารัก ทำงานได้ดีกับไฟล์ที่ฉันลอง
iano

ฉันพบวิธีการแก้ปัญหา 'เกือบเหมือนกัน' แต่คุณทำได้โดยตรงมากกว่าโดยใช้re.compileก่อนการใช้subงาน (ฉันใช้re.findall()สองครั้งzipและforวนซ้ำกับstr.replace()... )
heltonbiker

3
สิ่งนี้ไม่จำเป็นอีกต่อไปใน Python 2.7: xml.dom.minidom's toprettyxml () ตอนนี้สร้างเอาต์พุตเช่น '<id> 1 </id>' โดยค่าเริ่มต้นสำหรับโหนดที่มีโหนดชายด์ข้อความหนึ่งโหนด
Marius Gedminas

ฉันถูกบังคับให้ใช้ Python 2.6 ดังนั้นเคล็ดลับการจัดรูปแบบ regex นี้มีประโยชน์มาก ทำงานตามที่เป็นอยู่โดยไม่มีปัญหา
Mike Finch

@Marius Gedminas ฉันกำลังใช้งาน 2.7.2 และ "ค่าเริ่มต้น" ไม่แน่นอนอย่างที่คุณพูด
posfan12

23

ตามที่คนอื่นชี้ให้เห็น lxml มีเครื่องพิมพ์ที่สวยงามในตัว

โปรดทราบว่าโดยค่าเริ่มต้นจะเปลี่ยนส่วน CDATA เป็นข้อความปกติซึ่งอาจมีผลลัพธ์ที่น่ารังเกียจ

นี่คือฟังก์ชัน Python ที่เก็บรักษาอินพุตไฟล์และเปลี่ยนการเยื้องเท่านั้น (สังเกตstrip_cdata=False) นอกจากนี้ยังทำให้แน่ใจว่าเอาต์พุตใช้ UTF-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
มันสายไปแล้ว แต่ฉันคิดว่า lxml คงที่ CDATA หรือไม่ CDATA คือ CDATA ที่อยู่ข้างฉัน
elwc

ขอบคุณนี่เป็นคำตอบที่ดีที่สุด
George Chalhoub

20

BeautifulSoup มีprettify()วิธีการใช้งานที่ง่าย

มันเยื้องหนึ่งช่องว่างต่อระดับการเยื้อง มันทำงานได้ดีกว่า pretty_print ของ 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คุณสามารถวางไข่ subprocess และใช้มัน xmllint --format <file>พริตตี้พิมพ์ XML ของอินพุตไปยังเอาต์พุตมาตรฐาน

โปรดทราบว่าวิธีนี้ใช้โปรแกรมภายนอกกับไพ ธ อนซึ่งทำให้เป็นแฮ็ค

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

ฉันพยายามแก้ไขคำตอบ "ade" ด้านบน แต่ Stack Overflow จะไม่ให้ฉันแก้ไขหลังจากที่ฉันได้รับคำติชมโดยไม่ระบุชื่อ นี่เป็นฟังก์ชันรุ่น buggy ที่น้อยกว่าในการพิมพ์ ElementTree

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

หากคุณใช้การติดตั้ง DOM แต่ละตัวมีรูปแบบการพิมพ์ในตัวของตัวเอง:

# 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)

หากคุณกำลังใช้งานอย่างอื่นโดยไม่มีเครื่องพิมพ์สวยของตัวเองหรือเครื่องพิมพ์สวย ๆ นั้นไม่ได้ทำอย่างที่คุณต้องการคุณอาจต้องเขียนหรือซับคลาสซีเรียลไลเซอร์ของคุณเอง


6

ฉันมีปัญหาบางอย่างกับงานพิมพ์ที่สวยงามของ minidom ฉันได้รับ UnicodeError 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

ฉันเขียนวิธีแก้ปัญหาเพื่อใช้ ElementTree ที่มีอยู่และใช้ข้อความ / หางเพื่อเยื้องมันตามที่คาดไว้

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

XML สวย ๆ สำหรับงูหลามดูดีสำหรับงานนี้ (ชื่อที่เหมาะสมเช่นกัน)

ทางเลือกคือการใช้pyXMLซึ่งมีฟังก์ชั่น PrettyPrint


HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/คิดว่าโครงการนี้เป็นห้องใต้หลังคาทุกวันนี้น่าละอาย
8bitjunkie

3

นี่คือโซลูชัน Python3 ที่กำจัดปัญหาเรื่องบรรทัดใหม่ที่น่าเกลียด (ช่องว่างจำนวนมาก) และใช้ไลบรารีมาตรฐานซึ่งแตกต่างจากการใช้งานอื่น ๆ ส่วนใหญ่

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

มันเป็นเวอร์ชันหลามของปลั๊กอิน javascript / nodejs ที่เป็นที่นิยมของฉันที่มีชื่อเดียวกัน มันสามารถสวยพิมพ์ / ลดขนาด XML, JSON และข้อความ CSS อินพุตและเอาต์พุตสามารถเป็นสตริง / ไฟล์ในชุดค่าผสมใด ๆ มันกะทัดรัดมากและไม่มีการพึ่งพาใด ๆ

ตัวอย่าง :

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') 

ไลบรารีเฉพาะนี้จัดการปัญหาโหนดข้อความที่น่าเกลียด
Cameron Lowell Palmer

1

อีกทางเลือกหนึ่งถ้าคุณไม่ต้องการ reparse มีไลบรารี xmlpp.pyพร้อมget_pprint()ฟังก์ชัน มันใช้งานได้ดีและราบรื่นสำหรับกรณีการใช้งานของฉันโดยไม่ต้องแยกชิ้นส่วนวัตถุ lxml ElementTree


1
พยายาม minidom และ lxml และไม่ได้รับรูปแบบที่ถูกต้องและเยื้อง xml สิ่งนี้ทำงานได้ตามที่คาดไว้
david-hoze

1
ล้มเหลวสำหรับชื่อแท็กที่นำหน้าด้วยเนมสเปซและมียัติภังค์ (เช่น <ns: hyphenated-tag /> ส่วนที่เริ่มต้นด้วยการใส่ยัติภังค์จะลดลงเพียงแค่ให้เช่น <ns: ยัติภังค์ />
Endre ทั้ง

@EndreBoth ดีฉันไม่ได้ทดสอบ แต่บางทีมันอาจจะง่ายในการแก้ไขในรหัส xmlpp.py?
gaborous

1

คุณสามารถลองรูปแบบนี้ ...

ติดตั้งBeautifulSoupและlxmlไลบรารีbackend (parser):

user$ pip3 install lxml bs4

ประมวลผลเอกสาร XML ของคุณ:

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 ของHTML parser - ดู BS4 เอกสาร คุณต้องการ'xml'หรือ'lxml-xml'สำหรับตัวแยกวิเคราะห์ XML
user2357112 รองรับ Monica

1
ความคิดเห็นนี้จะถูกลบต่อไป อีกครั้งฉันได้ป้อนการร้องเรียนอย่างเป็นทางการ (นอกเหนือจาก) 4 ธง) ของการโพสต์การปลอมแปลงด้วย StackOverflow และจะไม่หยุดจนกว่าจะมีการตรวจสอบโดยทีมรักษาความปลอดภัยทางนิติเวช (บันทึกการเข้าถึงและประวัติรุ่น) การประทับเวลาด้านบนนั้นผิด (เป็นปี) และมีแนวโน้มว่าจะมีเนื้อหาเช่นกัน
NYCeyes

1
สิ่งนี้ใช้ได้ผลดีสำหรับฉันไม่แน่ใจว่าจะลงคะแนนเสียงจากเอกสารหรือไม่lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
Datanovice

1
@Datanovice ฉันดีใจที่มันช่วยคุณ :) สำหรับข้อสงสัยผู้ลงคะแนนมีคนดัดแปลงคำตอบเดิมของฉัน (ซึ่งระบุไว้อย่างถูกต้องตั้งแต่เริ่มแรกlxml-xml) จากนั้นพวกเขาก็ลงคะแนนในวันเดียวกันนั้น ฉันส่งการร้องเรียนอย่างเป็นทางการไปยัง S / O แต่พวกเขาปฏิเสธที่จะตรวจสอบ อย่างไรก็ตามฉันมีตั้งแต่ "de-tampered" คำตอบของฉันซึ่งตอนนี้ถูกต้องอีกครั้ง (และระบุlxml-xmlตามที่มันทำ) ขอบคุณ.
NYCeyes

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!")

สิ่งนี้ใช้งานได้เพียงเพราะ etree ตามค่าเริ่มต้นใช้two spacesเพื่อเยื้องซึ่งฉันไม่พบการเน้นการเยื้องมากนักดังนั้นจึงไม่ค่อยน่าสนใจ ฉันไม่สามารถตั้งค่าใด ๆ สำหรับ etree หรือพารามิเตอร์สำหรับฟังก์ชันใด ๆ เพื่อเปลี่ยนการเยื้อง etree มาตรฐาน ฉันชอบความง่ายในการใช้ etree แต่มันน่ารำคาญจริงๆสำหรับฉัน


0

สำหรับการแปลงเอกสาร xml ทั้งหมดเป็นเอกสาร xml ที่น่ารัก
(เช่นสมมติว่าคุณได้แตกไฟล์ [unzipped] เป็นไฟล์ LibreOffice Writer .odt หรือ. ods และคุณต้องการแปลงไฟล์ "content.xml" ที่น่าเกลียดเป็นไฟล์ที่น่าสนใจการควบคุมเวอร์ชัน git อัตโนมัติและgit difftoolการรับไฟล์. odt / .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()

ข้อมูลอ้างอิง:
- ขอบคุณคำตอบของ Ben Noland ในหน้านี้ซึ่งทำให้ฉันได้รับประโยชน์มากที่สุด


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='    ',))

มันทำงานได้ดีสำหรับ xml กับภาษาจีน!


0

หากด้วยเหตุผลบางอย่างคุณไม่สามารถรับมือกับโมดูล Python ใด ๆ ที่ผู้ใช้คนอื่นพูดถึงฉันขอแนะนำวิธีแก้ปัญหาต่อไปนี้สำหรับ Python 2.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)

เท่าที่ฉันรู้วิธีแก้ปัญหานี้จะทำงานบนระบบที่ใช้ Unix ที่มีการxmllintติดตั้งแพคเกจ


xmllint ได้รับคำแนะนำในคำตอบอื่นแล้ว: stackoverflow.com/a/10133365/407651
mzjn

@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()

มันใช้งานได้สำหรับฉันบางทีอาจมีบางคนใช้มัน :)


แสดงสกรีนช็อตตัวอย่างก่อนและหลังและบางทีคุณอาจหลีกเลี่ยง downvotes ในอนาคต ฉันไม่ได้ลองใช้รหัสของคุณและคำตอบอื่น ๆ ที่ชัดเจนดีกว่าฉันคิดว่า (และมากกว่า / เต็มรูปแบบเนื่องจากพวกเขาพึ่งพาห้องสมุดที่ดี) แต่ฉันไม่แน่ใจว่าทำไมคุณถึงได้ลงที่นี่ ผู้คนควรแสดงความคิดเห็นเมื่อพวกเขาลงคะแนน
Gabriel Staples
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.