精华内容
下载资源
问答
  • pXMLProc = pXMLDoc->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); _variant_t vNullVal; vNullVal.vt = VT_NULL; pXMLDoc->insertBefore(pXMLProc, vNullVal); // 创建根结点 _...
  • 使用DOM4J生成XML文件,节点内容如何换行,'\n'不行 在输出的节点内容中,有"字符,我希望保留,但是却转换成了转移字符 < ,如何能阻止这种转换?
  • XML添加节点换行和缩进问题

    千次阅读 2018-05-20 15:54:50
    问题当我们向XML文件中新增节点时,可能会遇到新增节点写在了一行,或者分行后没有缩进。这样会影响XML文件的美观性,以及我们可阅读性。今天我们用DOM解决以上问题,假设有一个XML文件:Book.xml,以下就是我们要...

    问题

    当我们向XML文件中新增节点时,可能会遇到新增节点写在了一行,或者分行后没有缩进。这样会影响XML文件的美观,以及我们可阅读性。

    今天我们用DOM解决以上问题,假设有一个XML文件:Book.xml,以下就是我们要达到的效果。

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book id="1">
            <name>C++ primer plus</name>
            <price>80</price>
        </book>
    </books>

    DOM中换行与缩进问题的解决方法

    操作步骤

    1.首先创建工厂,得到DocumentBuilder对象

    DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocmentBuilder();

    2.如果XML文件存在,就得到XML文件中的根节点,如果不存在创建一个根节点。

    存在

    Document document=builder.parse(file);//得到文档对象

    Element root=document.getDocumentElement();//得到根节点

    不存在

    Document document=builder.newDocument();//创建文档对象

    Element root=document.createElement("books");//创建一个根节点  books 根节点名

    3.创建子节点,并赋值

    Element book=document.createElement("book");//创建book节点

    book.setAttribute("id","1");//为book节点设置属性名 和属性值

    Element name=document.createElement("name");

    name.setTextContent("C++ Primer plus");//设置节点间的文本值

    Element price=documenr.createElement("price");

    price.setTextContent("80");

    4.添加节点到对应的位置

    book.appendChild(name);

    book.appendChild(price);//将name price作为book的子节点

    root.appendChild(book);//将book节点添加到根节点

    PS:注意添加的顺序。如果文件不存在 就将root节点添加到document中,如果存在则不需要。

    document.appendChild(root);

    5.将创建及添加好的元素写入到xml文件中,用方法将其封装

    public static void writer(Document document,String path){

            OutputFormat format=new OutputFormat(document);//输出格式

            format.setIndent(2);//设置输出格式  缩进2个单位

            fomat.setIndenting(true);//设置缩进

            XMLSerializer serializer=new XMLSerializer(new FileWriter(path),format);//写入的位置 以及写入的格式

            serializer.serialize(document);//写入Document对象

    }

    PS:OutputFormat和XMLSerializer导入的包是com.sun.org.apache.xml.internal.serialize下面的包。

    具体实现

    package Demo;
    
    import com.sun.org.apache.xml.internal.serialize.OutputFormat;
    import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Demo {
        public static void main(String[] args) throws Exception {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            boolean fig=false;//用于标记文件是否存在  false表示不存在
            Document books=null;
            Element root =null;
            String path="Books.xml";//文件路径
            File file=new File(path);
            if(!file.exists()){//文件不存在
                file.createNewFile();//新建一个文件
                books=builder.newDocument();//新建一个文档对象
                //创建根节点
                root=books.createElement("books");
            }else {//文件存在
                fig=true;
                books = builder.parse(path);//获得文件的文档对象
                //得到根节点
                root=books.getDocumentElement();
            }
            //创建节点设置属性
            Element book = books.createElement("book");
            book.setAttribute("id","1");
    
            Element price = books.createElement("price");
            price.setTextContent("80");
            Element name = books.createElement("name");
            name.setTextContent("C++ primer plus");
    
            //添加节点
            book.appendChild(name);
            book.appendChild(price);
    
            root.appendChild(book);
            //如果文件存在    不需要添加根节点(一个XML中只能有一个根节点)   
            if(!fig)    books.appendChild(root); //不存在将创建的根节点添加进去
            writer(books,path);//写入XML文件
        }
        public static void writer(Document document,String path) throws IOException {
            OutputFormat format= new OutputFormat(document);//写入格式
            format.setIndent(2);//缩进两个单位
            format.setIndenting(true);//开启缩进
            XMLSerializer serializer=new XMLSerializer(new FileWriter(path),format);//写入的位置 以及格式
            serializer.serialize(document);
        }
    }

    结果:


    换行和缩进都有了,达到了我们想要的效果。

    总结

    或许有小伙伴会问,在新增节点时,为何每次都需要判断文件是否存在?当我们需要频繁对XML文件进行操作时,只需将创建节点那部分封装即可。首先,如果文件不存的话,我们就需要创建一个XML文件,并且创建一个根节点。如果文件存在的话,我们只需得到根节点。然后将后面创建的节点加入到根节点下即可。需要注意的是如果文件不存在,还需要将根节点添加到文档(Document)对象下。


            每日鸡汤:该发生的总会发生,大多数担心的事又多数不会发生!

    Over!


    展开全文
  • 来源:...请问怎样让写出的XML文件里都一行一行的! using (XmlTextWriter xwriter = new XmlTextWriter(songlocatio...

    来源:http://social.microsoft.com/Forums/es-ES/visualcshartzhchs/thread/f0b1f040-724c-48d3-aa59-b828e45ddeca

    这个是我的程序代码?请问怎样让写出的XML文件里都一行一行的!

    using (XmlTextWriter xwriter = new XmlTextWriter(songlocation , null))
                {
                    xwriter.WriteStartDocument();
                    xwriter.WriteStartElement("myplayer");
                    xwriter.WriteStartElement("playingsongs");
                    xwriter.WriteAttributeString("total",songlist.Count .ToString ());
                    for (int i = 0; i < songlist.Count ;i++ )
                    {
                        xwriter.WriteAttributeString("song"+i.ToString (),songlist[i ].ToString ());
                    }
                    xwriter.WriteEndElement();
                    xwriter.WriteEndElement();
                    xwriter.WriteEndDocument();
                    xwriter.Flush();
                    xwriter.Close();
                }

    // 写入XML文档            

                XmlTextWriter writer = null;
                try
                {

                    writer = new XmlTextWriter(filePath, System.Text.Encoding.UTF8);
                    writer.Formatting = Formatting.Indented;
                    writer.WriteStartDocument();
                    writer.WriteStartElement("Log");
                }
                finally
                {
                    if (writer != null)
                        writer.Close();
                }

     

     

    展开全文
  • Python使用ElementTree处理XML缩进和换行

    千次阅读 2019-09-25 23:24:23
    from xml.etree import ElementTree # ...def pretty_xml(element, indent, newline, level=0): # elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行 if element: # 判断element是否有子元素 ...

    一、Python Xml介绍

    1.1 解析方法

    Python 有三种方法解析 XML。SAX,DOM,以及 ElementTree:

    1.SAX (simple API for XML )
    Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

    2.DOM(Document Object Model)
    将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。

    3.ElementTree(元素树)
    ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

    注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

    2.1 ElementTree介绍

    xml.etree.ElementTree模块实现了一个简单高效的API,用于解析和创建XML数据。

    警告 该xml.etree.ElementTree模块对于恶意构建的数据是不安全的。如果您需要解析不可信或未经身份验证的数据,请参见XML漏洞。

    ElementTree对xml操作分为两级。

    • xml.etree.ElementTree.ElementTree(element=None, file=None)。对于xml整个文件的操作(读、写等)是在这一级上。
    • class xml.etree.ElementTree.Element(tag, attrib={}, **extra)。对于xml元素的操作则在这一级上。

    二、ElementTree基本使用

    2.1 xml准备

    这个是看菜鸟教程用的xml,这里去掉了几个换行

    <collection shelf="New Arrivals">
    <movie title="Enemy Behind"><type>War, Thriller</type><format>DVD</format>
       <year>2003</year>
       <rating>PG</rating>
       <stars>10</stars>
       <description>Talk about a US-Japan war</description>
    </movie><movie title="Transformers">
       <type>Anime, Science Fiction</type>
       <format>DVD</format>
       <year>1989</year>
       <rating>R</rating>
       <stars>8</stars>
       <description>A schientific fiction</description>
    </movie><movie title="Trigun">
       <type>Anime, Action</type>
       <format>DVD</format>
       <episodes>4</episodes>
       <rating>PG</rating>
       <stars>10</stars>
       <description>Vash the Stampede!</description>
    </movie>
    <movie title="Ishtar">
       <type>Comedy</type>
       <format>VHS</format>
       <rating>PG</rating>
       <stars>2</stars>
       <description>Viewable boredom</description>
    </movie>
    </collection>
    

    2.2 读写xml

    import xml.etree.ElementTree as ET
    # 从文件读
    tree = ET.parse('movies.xml')
    root = tree.getroot() 
    # 从字符串读
    # root = ET.fromstring(country_data_as_string) 
    

    root 是 Element 类,有标签和属性字典root.tag,root.attrib

    三、遍历、换行和缩进

    这个是处理换行和缩进的代码

    from xml.etree import ElementTree  # 导入ElementTree模块
    
    
    def pretty_xml(element, indent, newline, level=0):  # elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行
        if element:  # 判断element是否有子元素    
            if (element.text is None) or element.text.isspace():  # 如果element的text没有内容
                element.text = newline + indent * (level + 1)
            else:
                element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)
                # else:  # 此处两行如果把注释去掉,Element的text也会另起一行
                # element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level
        temp = list(element)  # 将element转成list
        for subelement in temp:
            if temp.index(subelement) < (len(temp) - 1):  # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
                subelement.tail = newline + indent * (level + 1)
            else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个    
                subelement.tail = newline + indent * level
            pretty_xml(subelement, indent, newline, level=level + 1)  # 对子元素进行递归操作
    
    
    tree = ElementTree.parse('movies.xml')  # 解析movies.xml这个文件
    root = tree.getroot()  # 得到根元素,Element类
    pretty_xml(root, '\t', '\n')  # 执行美化方法
    tree.write('output.xml')
    

    参考文献

    1. 官方文档 https://docs.python.org/zh-cn/3.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element
    2. 菜鸟教程 https://www.runoob.com/python/python-xml.html
    展开全文
  • 在使用python中的xml.etree.ElementTree库解析xml文件时,默认不会做任何的换行和缩进处理,所有节点堆积在同一行,导致输出的xml文件阅读起来很不方便。本文通过增加换行和缩进来美化xml文件

    问题摘要

    在使用python中的xml.etree.ElementTree库解析xml文件时,默认不会做任何的换行和缩进处理,导致输出的xml文件阅读起来很不方便。以高通平台小基站射频校准配置文件为例,笔者希望该xml文件的格式如下所示,这样很容易找出Tx、Rx、Nl等等射频链路的校准配置。

    <?xml version='1.0' encoding='utf-8'?>
    <CalConfigDefinitions>
    	<BoardConfigs>
    		<BoardDef name="F02001-2" configs="F02001-2_LTE20" />
    	</BoardConfigs>
    	<CalConfigs>
    		<CalConfig name="F02001-2_LTE5" topology="407">
    			<TxConfig txPathIdList="TX1,TX2" antennaNum="1,2" bwConst="LTE5" band="B41" fg="2" enableFb="false" txRefFreq="2590" listOfTxSweepFreqMhz="2498.5,2510.5,2520.5,2530.5,2540.5,2560.5,2580.5,2600.5,2620.5,2640.5,2660.5,2670.5,2680.5,2687.5" firstGainState="40" firstGainStatePowerLimitHigh="10" firstGainStatePowerLimitLow="-45" highestAllowedGainState="0" targetMaxPower="17" txDcLeakageLimit="-40" txIqImageLimit="-40" maxFreqSweepPeakToPeakDelta="10" rxFbDcLeakageLimitDbfs="-34" rxFbIqImageLimitDbc="-40" rxfbSignalDbfsMin="-20" rxfbSignalDbfsMax="0" txFreqSweepTargetReferencePowerDbm="17" txDigitalGainMaxDb="-3" txHighDcLeakageLimit="-43" txLowCutoffGainState="30" calDataAlsoAppliesTo="LTE10,LTE15,LTE20" txMonotonicCheckThresholdDb="-3" />
    			<RxFb1AclrNoiseCal rxfbPathIdList="FB1,FB2" bwConst="LTE5" band="B41" fg="2" freq="2590" rxfbMaxGainState="16" />
    			<RxConfig rxPathIdList="RX1,RX2" antennaNum="1,2" bwConst="LTE5" band="B41" fg="2" rxRefFreqMhz="2590" listOfRxSweepFreqMhz="2498.5,2510.5,2520.5,2530.5,2540.5,2560.5,2580.5,2600.5,2620.5,2640.5,2660.5,2670.5,2680.5,2687.5" rxGainStateList="0,1,2,3,4,5,6,7" rxSigGenPowersForGainState="-66,-59,-56,-51,-46,-41,-31,-21" rxDcLeakageLimitDbfs="-40" rxIqImageLimitDbc="-40" maxFreqSweepPeakToPeakDelta="10" rxSignalDbfsMin="-40" rxSignalDbfsMax="-20" calDataAlsoAppliesTo="LTE10,LTE15,LTE20" />
    			<RxConfig rxPathIdList="NL1" antennaNum="3" bwConst="LTE20" band="B25" fg="3" rxRefFreqMhz="1960" listOfRxSweepFreqMhz="1930,1940,1945,1950,1955,1960,1965,1970,1975,1980,1985,1990,1995" rxGainStateList="0,1,2,3,4,5" rxSigGenPowersForGainState="-65,-57,-51,-40,-29,-18" rxDcLeakageLimitDbfs="-40" rxIqImageLimitDbc="-40" maxFreqSweepPeakToPeakDelta="10" rxSignalDbfsMin="-40" rxSignalDbfsMax="-20" />
    		</CalConfig>
    	</CalConfigs>
    </CalConfigDefinitions>
    

    而实际Python xml.etree.ElementTree库默认输出的xml文件如下,所有节点堆积在同一行。下面通过增加换行和缩进来美化xml文件,读者不需要纠结该xml文件的实际意义,本文仅以此为例。

    <?xml version='1.0' encoding='utf-8'?>
    <CalConfigDefinitions><BoardConfigs><BoardDef name="F02001-2" configs="F02001-2_LTE20" /></BoardConfigs><CalConfigs><CalConfig name="F02001-2_LTE5" topology="407"><TxConfig txPathIdList="TX1,TX2" antennaNum="1,2" bwConst="LTE5" band="B41" fg="2" enableFb="false" txRefFreq="2590" listOfTxSweepFreqMhz="2498.5,2510.5,2520.5,2530.5,2540.5,2560.5,2580.5,2600.5,2620.5,2640.5,2660.5,2670.5,2680.5,2687.5" firstGainState="40" firstGainStatePowerLimitHigh="10" firstGainStatePowerLimitLow="-45" highestAllowedGainState="0" targetMaxPower="17" txDcLeakageLimit="-40" txIqImageLimit="-40" maxFreqSweepPeakToPeakDelta="10" rxFbDcLeakageLimitDbfs="-34" rxFbIqImageLimitDbc="-40" rxfbSignalDbfsMin="-20" rxfbSignalDbfsMax="0" txFreqSweepTargetReferencePowerDbm="17" txDigitalGainMaxDb="-3" txHighDcLeakageLimit="-43" txLowCutoffGainState="30" calDataAlsoAppliesTo="LTE10,LTE15,LTE20" txMonotonicCheckThresholdDb="-3" /><RxFb1AclrNoiseCal rxfbPathIdList="FB1,FB2" bwConst="LTE5" band="B41" fg="2" freq="2590" rxfbMaxGainState="16" /><RxConfig rxPathIdList="RX1,RX2" antennaNum="1,2" bwConst="LTE5" band="B41" fg="2" rxRefFreqMhz="2590" listOfRxSweepFreqMhz="2498.5,2510.5,2520.5,2530.5,2540.5,2560.5,2580.5,2600.5,2620.5,2640.5,2660.5,2670.5,2680.5,2687.5" rxGainStateList="0,1,2,3,4,5,6,7" rxSigGenPowersForGainState="-66,-59,-56,-51,-46,-41,-31,-21" rxDcLeakageLimitDbfs="-40" rxIqImageLimitDbc="-40" maxFreqSweepPeakToPeakDelta="10" rxSignalDbfsMin="-40" rxSignalDbfsMax="-20" calDataAlsoAppliesTo="LTE10,LTE15,LTE20" /><RxConfig rxPathIdList="NL1" antennaNum="3" bwConst="LTE20" band="B25" fg="3" rxRefFreqMhz="1960" listOfRxSweepFreqMhz="1930,1940,1945,1950,1955,1960,1965,1970,1975,1980,1985,1990,1995" rxGainStateList="0,1,2,3,4,5" rxSigGenPowersForGainState="-65,-57,-51,-40,-29,-18" rxDcLeakageLimitDbfs="-40" rxIqImageLimitDbc="-40" maxFreqSweepPeakToPeakDelta="10" rxSignalDbfsMin="-40" rxSignalDbfsMax="-20" /></CalConfig></CalConfigs></CalConfigDefinitions>
    

    软件环境说明

    Python版本: Python 3.7
    Xml解析库: xml.etree.ElementTree
    IDE: PyCharm

    网络上xml美化方法

    遇到问题首先想到的是搜一下大神们是如何操作的,网上的解决办法基本上大同小异:在创建好所有节点之后、初始化tree之前进行换行(\n)和缩进(\t)处理,如以下部分代码所示。

    def prettyXml(self,tree,indent,newline,level=0):
        """
        Pretty Xml File before writing
        :param tree: 创建好的父节点,未初始化的tree
        :param indent: 缩进“\t”
        :param newline: 换行“\n”
        :param level: 用于递归操作的变量,实现不同级别节点增加不同数量的缩进“\t”
        :return: 无
        """
        treeList=list(tree)
        for subElement in treeList:
            # print(subElement)
            if treeList.index(subElement) < (len(treeList) - 1):
                subElement.tail=newline+indent*(level+1)
            else:
                subElement.tail=newline+indent*level
            self.prettyXml(subElement,indent,newline,level+1)
    
    # parent_node的创建过程省略
    prettyXml(parent_node,'\t','\n')		# 换行和缩进处理
    tree=ET.ElementTree(parent_node)		# 初始化tree,ET为导入的xml.etree.ElementTree,导入过程省略
    write_xml(tree, r"E:\2_PersonalStudy\1_PythonStudy\MyPyCharmProject\TestDemo\venv\Output\Test.xml") 	# 生成xml文件,方法省略
    

    通过以上处理后,可以得到如下xml文件。看起来要美观很多,但是和笔者想要得到的结果还有一定差距。返回来查看上述prettyXml方法,只能实现在节点的tail处增加换行和缩进处理,对于父节点CalConfigDefinitions、BoardConfigs、CalConfigs的“<…>”末尾处无法处理,这是该方法的不足之处,需要进一步处理。

    <?xml version='1.0' encoding='utf-8'?>
    <CalConfigDefinitions><BoardConfigs><BoardDef name="F02001-2" configs="F02001-2_LTE20" />
    	</BoardConfigs>
    	<CalConfigs><CalConfig name="F02001-2_LTE5" topology="407"><TxConfig txPathIdList="TX1,TX2" antennaNum="1,2" bwConst="LTE5" band="B41" fg="2" enableFb="false" txRefFreq="2590" listOfTxSweepFreqMhz="2498.5,2510.5,2520.5,2530.5,2540.5,2560.5,2580.5,2600.5,2620.5,2640.5,2660.5,2670.5,2680.5,2687.5" firstGainState="40" firstGainStatePowerLimitHigh="10" firstGainStatePowerLimitLow="-45" highestAllowedGainState="0" targetMaxPower="17" txDcLeakageLimit="-40" txIqImageLimit="-40" maxFreqSweepPeakToPeakDelta="10" rxFbDcLeakageLimitDbfs="-34" rxFbIqImageLimitDbc="-40" rxfbSignalDbfsMin="-20" rxfbSignalDbfsMax="0" txFreqSweepTargetReferencePowerDbm="17" txDigitalGainMaxDb="-3" txHighDcLeakageLimit="-43" txLowCutoffGainState="30" calDataAlsoAppliesTo="LTE10,LTE15,LTE20" txMonotonicCheckThresholdDb="-3" />
    			<RxFb1AclrNoiseCal rxfbPathIdList="FB1,FB2" bwConst="LTE5" band="B41" fg="2" freq="2590" rxfbMaxGainState="16" />
    			<RxConfig rxPathIdList="RX1,RX2" antennaNum="1,2" bwConst="LTE5" band="B41" fg="2" rxRefFreqMhz="2590" listOfRxSweepFreqMhz="2498.5,2510.5,2520.5,2530.5,2540.5,2560.5,2580.5,2600.5,2620.5,2640.5,2660.5,2670.5,2680.5,2687.5" rxGainStateList="0,1,2,3,4,5,6,7" rxSigGenPowersForGainState="-66,-59,-56,-51,-46,-41,-31,-21" rxDcLeakageLimitDbfs="-40" rxIqImageLimitDbc="-40" maxFreqSweepPeakToPeakDelta="10" rxSignalDbfsMin="-40" rxSignalDbfsMax="-20" calDataAlsoAppliesTo="LTE10,LTE15,LTE20" />
    			<RxConfig rxPathIdList="NL1" antennaNum="3" bwConst="LTE20" band="B25" fg="3" rxRefFreqMhz="1960" listOfRxSweepFreqMhz="1930,1940,1945,1950,1955,1960,1965,1970,1975,1980,1985,1990,1995" rxGainStateList="0,1,2,3,4,5" rxSigGenPowersForGainState="-65,-57,-51,-40,-29,-18" rxDcLeakageLimitDbfs="-40" rxIqImageLimitDbc="-40" maxFreqSweepPeakToPeakDelta="10" rxSignalDbfsMin="-40" rxSignalDbfsMax="-20" />
    		</CalConfig>
    	</CalConfigs>
    </CalConfigDefinitions>
    

    网络上xml美化方法进一步优化

    让我们站在大神们的肩膀上继续成长。既然prettyXml方法只能在tail处操作,那是否可以通过修改ElementTree.py源码实现"<…>"末尾处换行和缩进呢?

    查找ElementTree.py源码,发现可以在 _serialize_xml方法中增加换行和缩进处理,修改后的代码如下(代码中还去除了节点属性的默认排序功能,读者可忽略此部分处理,如果感兴趣可以查看笔者的另一篇关于xml节点属性排序问题的博客)。

    综上,通过修改_serialize_xml方法并结合使用prettyXml方法,便可以输出问题摘要章节中笔者想要得到的xml文件。

    def _serialize_xml(write, elem, qnames, namespaces,
                       short_empty_elements, level=1, **kwargs):		# 增加level参数,用于递归操作,不同级别节点增加不同数量的“\t”
        tag = elem.tag
        text = elem.text
        if tag is Comment:
            write("<!--%s-->" % text)
        elif tag is ProcessingInstruction:
            write("<?%s?>" % text)
        else:
            tag = qnames[tag]
            if tag is None:
                if text:
                    write(_escape_cdata(text))
                for e in elem:
                    _serialize_xml(write, e, qnames, None,
                                   short_empty_elements=short_empty_elements)
            else:
                write("<" + tag)
                items = list(elem.items())
                if items or namespaces:
                    if namespaces:
                        for v, k in sorted(namespaces.items(),
                                           key=lambda x: x[1]):  
                            if k:
                                k = ":" + k
                            write(" xmlns%s=\"%s\"" % (
                                k,
                                _escape_attrib(v)
                                ))
                    for k, v in items: 		# 【此处可不做关注】和源码比较,去掉了sorted方法,实现节点属性顺序的自定义
                        if isinstance(k, QName):
                            k = k.text
                        if isinstance(v, QName):
                            v = qnames[v.text]
                        else:
                            v = _escape_attrib(v)
                        write(" %s=\"%s\"" % (qnames[k], v))
                if text or len(elem) or not short_empty_elements:
                    write(">\n" + level * "\t")  							# 在>处增加“\n”和“\t”
                    if text:
                        write(_escape_cdata(text))
                    for e in elem:
                        _serialize_xml(write, e, qnames, None,
                                       short_empty_elements=short_empty_elements,level=level+1)	# 增加level参数,低级别节点“\t”加1
                    write("</" + tag + ">")
                else:
                    write(" />")
        if elem.tail:
            write(_escape_cdata(elem.tail))
    

    重写ElementTree.py源码思考

    虽然已经实现了xml文件的美化,但是我们是通过修改 _serialize_xml和使用prettyXml来实现的,其实完全可以合并到一起,也就是将节点tail的处理也加入到_serialize_xml方法中,代码如下,输出xml的效果是一样的。

    def _serialize_xml(write, elem, qnames, namespaces,
                       short_empty_elements, level=1, **kwargs):		# 增加level参数,用于递归操作,不同级别节点增加不同数量的“\t”
        tag = elem.tag
        text = elem.text
        if tag is Comment:
            write("<!--%s-->" % text)
        elif tag is ProcessingInstruction:
            write("<?%s?>" % text)
        else:
            tag = qnames[tag]
            if tag is None:
                if text:
                    write(_escape_cdata(text))
                for e in elem:
                    _serialize_xml(write, e, qnames, None,
                                   short_empty_elements=short_empty_elements)
            else:
                write("<" + tag)
                items = list(elem.items())
                if items or namespaces:
                    if namespaces:
                        for v, k in sorted(namespaces.items(),
                                           key=lambda x: x[1]):  # sort on prefix
                            if k:
                                k = ":" + k
                            write(" xmlns%s=\"%s\"" % (
                                k,
                                _escape_attrib(v)
                                ))
                    for k, v in items:  # 【此处可不做关注】和源码比较,去掉了sorted方法,实现节点属性顺序的自定义
                        if isinstance(k, QName):
                            k = k.text
                        if isinstance(v, QName):
                            v = qnames[v.text]
                        else:
                            v = _escape_attrib(v)
                        write(" %s=\"%s\"" % (qnames[k], v))
                if text or len(elem) or not short_empty_elements:
                    write(">\n" + level * "\t")		# 在>处增加“\n”和“\t”
                    if text:
                        write(_escape_cdata(text))
                    elemList=list(elem)			# 将elem转化成列表
                    for e in elem:				# 循环处理各个节点
                        if elemList.index(e) < (len(elemList) - 1):
                            e.tail = "\n" + "\t" * (level)		# 父节点的子节点换行和缩进处理(最后一个子节点除外)
                        else:
                            e.tail = "\n" + "\t" * (level - 1)	# 父节点的最后一个子节点换行和缩进处理
                        _serialize_xml(write, e, qnames, None,
                                       short_empty_elements=short_empty_elements,level=level+1)	# 增加level参数,低级别节点“\t”加1
                    write("</" + tag + ">")
                else:
                    write(" />")
        if elem.tail:
            write(_escape_cdata(elem.tail))
    

    总结说明

    1. 代码的优化永无止境,小白一枚,欢迎大家一起探讨;
    2. 此文档仅用于Python学习记录和交流,如能帮助到读者倍感荣幸。
    展开全文
  • 1.今天做项目时候生成XML文件,有些节点是为空节点,但是生成之后的节点自动换行了,网上百度了一下,大都是设置添加属性为xsi:nil="true"的空节点。  http://www.acehat.com/kf/201503/78602.html  但是本人太...
  • Java生成XML时,换行和缩进

    千次阅读 2015-12-17 14:57:49
    * 将XML文档转换为输出流 * * @param document XML文档 * @return 输出流 * @throws TransformerException * @author 2015年12月16日10:17:46 */ private ByteArrayOutputStream ...
  • 首先附上一段没有改代码之前我的xml文件解析前后其中一段内容对比: <quoteString>N</quoteString> <sql>-- SQL statement here update test_column_comment set name = 'test execute sql'&...
  • 为了方便统一管理,国际化等,我们通常把字符串保存在string.xml中,但这些字符串中直接输入一些符号不起任何作用,比如基本的换行、缩进、空格,这就要用转义字符来进行转义,这样才能给字符串添加样式。...
  • xml文件添加新节点时没有缩进和换行的解决方案
  • XML换行

    千次阅读 2012-06-04 23:45:38
    pKCXML.CreateInstance(__uuidof(MSXML2::DOMDocument40)) pDocElement->appendChild(pDoc->createTextNode("\n\t"));   pDocElement->appendChild(pNewChildElement);...1、XML换行实现 CoInitialize(NULL);
  • SAX生成XML文件第一行根节点不换行怎么解决,走过路过不要错过了。。。 ``` <?xml version="1.0" encoding="utf-8"?> 李磊 <age>30 韩梅梅 <age>25 ``` 已经添加换行了 ``` // 是否自动添加...
  • XML文档进行格式化(换行,缩进),C#的很简单
  • mini-xml换行

    千次阅读 2013-11-21 20:00:04
    这个问题困扰了我有一些天,由于当时不用换行也行,就那么用了,但是用wireshark抓包,都在一行看起来实在不友好,过了一些天再看用户手册发现了奥秘,感觉手册写了不太清楚。 如果不加换行会是KeepAlive 加了换行...
  • #_*_encoding:utf-8_*_ # -- seanyxie 2012.3.23 -- # ===minidom操作XML代码示例 ...import codecs # ==由于minidom默认的writexml()函数在读取一个xml文件后,修改后重新写入如果加了newl='\n',会将原有的x
  • C#生成空节点XML文件,自动换行问题 myXmlDoc.Save(FilePathName);改为以下代码 XmlDocument myXmlDoc = new XmlDocument(); myXmlDoc.Load(FilePathName); XmlNode rootNode = myXmlDoc.SelectSingleNode("body"); ...
  • android 资源文件添加空格/tab/换行

    千次阅读 2017-07-26 16:31:32
    在代码中编写数组时,我们可以通过使用space空格键来为字符添加空格,可是在代码中使用中文数组并不太好,android讲究的是资源和...让我们来看看怎样才能在资源文件添加空格,tab,和换行。<string name="text"> &#
  • 为了方便统一管理,国际化等,我们通常把字符串保存在string.xml中,但这些字符串中直接输入一些符号不起任何作用,比如基本的换行、缩进、空格,这就要用转义字符来进行转义,这样才能给字符串添加样式。...
  • xml创建使用的是xml.etree.ElementTree 1.在文件顶部自动生成描述内容:在使用write时将...2.内容自动换行和缩进:在添加Element的text和tail属性中添加换行符和制表符来实现换行和缩进的效果 修改前: root = Elemen
  • XML的写入_dom4j添加、删除、修改Xml文件内容 【工程截图】 【person.xml】准备一个xml文件 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;students&gt; &lt;...
  • Open fileName For Append As #1 来生成xml文件,德文就变成了乱码,故用MSXML2.DOMDocument对象来添加,但是最后由个问题就是,生成出来的xml文件时在一行的,用IE打开时换行的,但是用Nodepad++打开却是在一行,...
  • string.xml中加入空格、换行

    千次阅读 2014-01-10 16:48:25
    安卓开发时用value目录下的string.xml文件保存全局的字符串变量,来方便支持多种语言。 看起来就像这样: AndroidTest 一行字字符串中需要加入换行和空格怎么办,直接在string name="xxx">和string>中间添加回车...
  • XML文件写入

    2016-10-24 22:18:08
    xml文件写入
  • dom方法生成xml文件

    2017-10-10 16:32:20
    以下代码详细展示了dom方法如何生成xml文件,其中需注意...2.在将dom树转换为xml文件时需留意换行操作(否则xml文件生成后无空格换行)   package dom; import java.io.File; import javax.xml.parsers.Docum...
  • XML文件生成

    2017-05-21 08:39:06
    XML文件生成方法1.DOM和SAX(官方) DOM生成XML文件(基于tree) 1.获取documentBuilder对象 2.获取Document对象 3.创建根节点 4.将子节点添加到DOM树中 5.创建TransformFactory对象 6.创建Transformer对象 ...
  • XML文件生成和解析

    千次阅读 2016-05-31 19:41:41
    使用Dom生成xml文件和解析xml文件  xml这种文件格式在很多时候都是很适合我们用来存取数据的,所以利用程序来生成xml文件和解析xml文件就显得比较重要了。在dom中是把每一个元素都看做是一个节点Node的,所有页面上...
  • java用docment方式动态生成xml 并且添加dtd文件 实例 以下代码引入目录 import org.apache.xerces.dom.CoreDocumentImpl; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,900
精华内容 14,360
关键字:

xml文件添加换行