如何使用xmlformatter解决xml中的&符

时间:2018-12-31 04:28:40

标签: python xml xml-parsing elementtree

我仍在学习Python,因此,如果我的以下方法看起来不太乐观,请耐心等待。我正在编写一个程序,该程序将读取xml文件并添加缺少的节点。我正在使用Python的ElementTree浏览xml并进行更改。

不幸的是,ElementTree不会格式化xml中添加的内容。它只是将所有内容放在一行中。因此,要解决此问题,我已经导入了xmlformatter。 xmlformatter很好用,但是它正在将我的(“&”号,分号)更改为xml中的实际引号,因为有问题的xml文件使用“&”表示引号。

这是xml代码的示例:

    <override action="replaceElement" path="pdf-        
    list/pdf[@name="HfsSdbWks" ]">
    <element name="pdf">
    <attribute name="size" value="186"></attribute>
    <attribute name="name" value="HfsSdbWks"></attribute>
    <attribute name="path" 
    value="/clientFolder/downloads/HFS_SDB_Wks.pdf"> 
    </attribute>
    <attribute name="devPath" 
    value="/clientFolder/downloads/HFS_SDB_Wks.pdf"></attribute>
    </element>
    </override>

所以我的问题确实是:解决这些&的最佳方法是什么?

我解决此问题的个人方法是先将整个文件读成字符串。然后,在该字符串内用&quot;替换所有出现的1234abcd或基本上任何能保持xml完整的唯一类型的char字符串,然后在格式化后可以恢复原状。

    def createPdfOvr(self, ovrCopy):  #these are methods inside a class

    if self.xml_string != '':
        with open(self.OVR_COPY, 'w') as f:
            f.write(self.xml_string)


    def formatXML(self, xml_string):
    formatted_xml =  
    xml.Formatter().format_string(self.xml_string).decode("utf-8")
    self.xml_string = formatted_xml.replace('abc1234', '&quot;')

目前,我有预期的结果。这是具有所有新节点/属性的更新后的xml文件,其格式设置为可读。这是代码:

    overrides parent="runtime/view/PDF.xml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="FndtOverridesSchema.xsd">
    <override action="replaceElement" path="pdf- 
   list/pdf[@name=&quot;HfsSdbWks&quot; ]">
   <element name="pdf">
   <attribute name="size" value="186"></attribute>
   <attribute name="name" value="HfsSdbWks"></attribute>
   <attribute name="path" 
   value="/01040_ybr_ybrfndt/downloads/HFS_SDB_Wks.pdf"></attribute>
   <attribute name="devPath" 
   value="/01040_ybr_ybrfndt/downloads/HFS_SDB_Wks.pdf"></attribute>
   </element>
   </override>
   <----This is the new node that was added---->
   <override action="replaceElement" path="pdf- 
   list/pdf[@name=&quot;Hippa&quot; ]">
   <element name="pdf">
   <attribute name="size" value="129"></attribute>
   <attribute name="name" value="Hippa"></attribute>
   <attribute name="path" value="/01040_ybr_ybrfndt/downloads/Hippa.pdf"> 
   </attribute>
   <attribute name="devPath" 
   value="/01040_ybr_ybrfndt/downloads/Hippa.pdf"></attribute>
   </element>
   </override>

1 个答案:

答案 0 :(得分:1)

通常,解析XML然后重新序列化将丢失XML认为不重要的信息-例如,开始标记中的属性之间的多余空格,属性的顺序,冗余的命名空间声明或&quot;"之间的区别。

如果保留这些信息对您而言真的很重要,那么您首先应该问为什么?如果XML解析器不关心区分,那么为什么呢?一种可能的答案是,您的工作流程涉及转换后手动编辑XML。我本人当然也曾担任过该职位,在这种情况下,我求助于您使用的相同解决方法。