我仍在学习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>
所以我的问题确实是:解决这些&的最佳方法是什么?
我解决此问题的个人方法是先将整个文件读成字符串。然后,在该字符串内用"
替换所有出现的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', '"')
目前,我有预期的结果。这是具有所有新节点/属性的更新后的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="HfsSdbWks" ]">
<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="Hippa" ]">
<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>
答案 0 :(得分:1)
通常,解析XML然后重新序列化将丢失XML认为不重要的信息-例如,开始标记中的属性之间的多余空格,属性的顺序,冗余的命名空间声明或"
和"
之间的区别。
如果保留这些信息对您而言真的很重要,那么您首先应该问为什么?如果XML解析器不关心区分,那么为什么呢?一种可能的答案是,您的工作流程涉及转换后手动编辑XML。我本人当然也曾担任过该职位,在这种情况下,我求助于您使用的相同解决方法。