这是链接中提出的问题的扩展:- How to insert sub-elements of xml tag at specific position using python script?
如果我在有Element Tree的地方使用python 3,它工作得很好。如果我没有Python3(因为我使用的当前版本是2.6,不能升级),我如何写xml_declaration标志为真的xml文件?似乎xml标志在解析时被移除了。基本上,我在解析xml时遇到了错误:
org.xml.sax.SAXParseException; systemId: file:config.xml; lineNumber: 1;
columnNumber: 1; file:config.xml<Line 1, Column 1>: XML-20108: (Fatal Error) Start of root element expected.[[
at oracle.xml.parser.v2.XMLError.flushErrorHandler(XMLError.java:425)
at oracle.xml.parser.v2.XMLError.flushErrors1(XMLError.java:290)
at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:476)
at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:417)
at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:287)
at oracle.ossmgmt.common.util.xml.XMLUtilityParser.validate(XMLUtilityParser.java:141)
at oracle.ossmgmt.common.util.xml.XMLUtilityParser.initParse(XMLUtilityParser.java:256)
at oracle.ossmgmt.common.util.xml.XMLUtility.initParse(XMLUtility.java:381)
我还尝试使用lxml :-
from lxml import etree as ET
param1='conf.xml'
tree = ET.parse(param1)
print(ET.getroot())
param2='Target'
target = tree.find(param2)
#print target.tag,target.attrib
seq = 'Attribute NAME="EFG" VALUE="1234"'
param3 = seq
temp = ET.Element(param3)
temp.tail = '\n'
target.insert(4,temp)
tree.write(param1, encoding='utf-8', xml_declaration=True)
但在这里我得到的错误是:-
Traceback (most recent call last):
File "b.py", line 10, in <module>
temp = ET.Element(param3)
File "lxml.etree.pyx", line 2346, in lxml.etree.Element
(src/lxml/lxml.etree.c:46617)
File "apihelpers.pxi", line 113, in lxml.etree._makeElement
(src/lxml/lxml.etree.c:10475)
File "apihelpers.pxi", line 1405, in lxml.etree._tagValidOrRaise
(src/lxml/lxml.etree.c:21541)
ValueError: Invalid tag name u'Attribute NAME="EFG" VALUE="1234"'
发布于 2018-07-01 02:38:34
我不太确定你想要的最终结构是什么,但是:
seq = 'Attribute NAME="EFG" VALUE="1234"'
param3 = seq
temp = ET.Element(param3)
最有可能是这样的:
seq = 'Attribute'
#Create element <Attribute>
temp = ET.Element(seq)
#Set attributes of <Attribute>
temp.set("NAME","EFG")
temp.set("VALUE","1234")
https://stackoverflow.com/questions/51116376
复制相似问题