对于xml
<grandparent>
<parent1>
<child>data1</child>
</parent1>
<parent2>
<child>data2</child>
</parent2>
</grandparent>
Run Code Online (Sandbox Code Playgroud)
我需要包含父元组的列表,xml中每个父元素的数据.
有没有办法使用cElementTree?我能够为孩子,数据做这件事,但不幸的是孩子在所有的价值观上是相同的,因此没有多少用处.
我正在解析700mb文件,我有以下代码在我的测试文件上工作正常,没有行context.iter(context)和事件,elem = context.next().
form xml.etree import cElementTree as ET
source = ("AAT.xml")
context = iter(context)
event, root = context.next()
for event, elem in context:
if event == event("end"):
some processing...
elem.clear()
root.clear()
Run Code Online (Sandbox Code Playgroud)
然而,当我继续iterparse 700mb文件它仍然崩溃.阅读:
清除()树时使用ElementTree.iterparse()时内存使用量是否会增加?
我相信这是因为我需要清除root,但是我已经遵循了上面已经包含的一些教程我不断收到错误:
line 9, in <module>
event, root = context.next()
AttributeError: 'iterparse' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)
我还是Python的新手,我无法理解为什么会发生这种情况,据我所知,我与这些例子一致.
我有一个现有的 xml 文件,如下所示:
<vehicleTravelTimeMeasurements>
<vehicleTravelTimeMeasurement name="ckkkkkkkkkk" no="2">
<start link="1" pos="3.864983"/>
<end link="3" pos="23.275375"/>
</vehicleTravelTimeMeasurement>
<vehicleTravelTimeMeasurement name="" no="3">
<start link="1" pos="3.864983"/>
<end link="2" pos="13.275375"/>
</vehicleTravelTimeMeasurement>
</vehicleTravelTimeMeasurements>
Run Code Online (Sandbox Code Playgroud)
我尝试使用 xml.etree.cElementTree 构建与上面所示相同的格式,并将它们正确添加到 xml 中:
new = ET.Element("vehicleTravelTimeMeasurement", name = "kkk", no = "4")
newsub1 = ET.Element("start", link = "1", pos="3.88888")
newsub2 = ET.Element("end",link = "3", pos = "3.88888")
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
先感谢您!
我cElementTree在 Python 中使用模块来获取XML树的文本子级,使用text属性。但它似乎只适用于直接文本孩子(见下文)。
$ python
...
>>> import xml.etree.cElementTree as ET
>>> root = ET.XML('<root><elm key="value">Some text</elm>More text</root>')
>>> root.text
>>> root = ET.XML('<root>Text 1<elm key="value">Text</elm>Text 2<elm2 />Text 3</root>')
>>> root.text
'Text 1'
>>>
Run Code Online (Sandbox Code Playgroud)
是否有可能检索所有直接给定的元素(如可能的列表,即文本儿童['More text']和['Text 1', 'Text 2', 'Text 3']在上面的例子中)使用的cElementTree模块?
我正在使用cElementTree来解析xml文件.使用.getroot()函数提供元素类型作为结果.我想在if语句中使用这种类型
if type(elementVariable) == 'Element':
do stuff
Run Code Online (Sandbox Code Playgroud)
但是,当我执行以下操作时,无法识别该类型:
import xml.etree.cElementTree as xml
file = 'test.xml'
# parse the xml file into a tree
tree = xml.parse(file)
# Get the root node of the xml file
rootElement = tree.getroot()
return rootElement
print type(rootElement)
print type(rootElement) == 'Element'
print type(rootElement) == Element
Run Code Online (Sandbox Code Playgroud)
输出:
<type 'Element'>
False
Traceback (most recent call last):
File "/homes/ndeklein/workspace/MS/src/main.py", line 39, in <module>
print type(rootElement) == Element
NameError: name 'Element' is not defined
Run Code Online (Sandbox Code Playgroud)
所以
print type(rootElement)
Run Code Online (Sandbox Code Playgroud)
给'元素'作为类型,但是
print …Run Code Online (Sandbox Code Playgroud) 我正在使用以下方法打开 URL:
response = urllib2.urlopen(url, data, timeout=_TIMEOUT)
Run Code Online (Sandbox Code Playgroud)
并使用response.read(),它提供以下输出:
<XMLlookup licenseid="X4X6X42" reason="OK" status="1" />
Run Code Online (Sandbox Code Playgroud)
但是当我想使用 ElementTree 解析它时,如下所示:
print response.read()
t = ET.parse(response)
r = t.getroot()
print r.attrib.get('status')
Run Code Online (Sandbox Code Playgroud)
给我以下错误消息:
File "<string>", line 62, in parse
File "<string>", line 38, in parse
cElementTree.ParseError: no element found: line 1, column 0
Run Code Online (Sandbox Code Playgroud)
但是当我删除该行时response.read(),代码工作正常。我究竟做错了什么?
<grandParent>
<parent>
<child>Sam/Astronaut</child>
</parent>
</grandParent>
Run Code Online (Sandbox Code Playgroud)
我想通过在父标记内添加另一个子标记来修改上述XML.我正在做这样的事......
tree = ET.parse("test.xml")
a=ET.Element('parent')
b=ET.SubElement(a,"child")
b.text="Jay/Doctor"
tree.write("test.xml")
Run Code Online (Sandbox Code Playgroud)
这是修改xml文件的正确方法吗?有更好的方法吗?或者我应该在上面的代码中处理什么?
celementtree ×7
python ×7
xml ×4
elementtree ×2
xml-parsing ×2
if-statement ×1
iterparse ×1
memory ×1
types ×1
urllib2 ×1