我在使用ElementTree中的属性XPath Selector时遇到了问题,根据文档我应该可以这样做 这是一些示例代码 XML <root> <target name="1"> <a></a> <b></b> </target> <target name="2"> <a></a> <b></b> </target> </root> python def parse(document): root = et.parse(document) for target in root.findall("//target[@name='a']"): print target._children 我收到以下exception: expected path separator ([)
我很难find一个很好的,基本的例子,如何使用元素树在Python中parsingXML。 从我所能find的,这似乎是用于parsingXML的最简单的库。 以下是我正在使用的XML示例: <timeSeriesResponse> <queryInfo> <locationParam>01474500</locationParam> <variableParam>99988</variableParam> <timeParam> <beginDateTime>2009-09-24T15:15:55.271</beginDateTime> <endDateTime>2009-11-23T15:15:55.271</endDateTime> </timeParam> </queryInfo> <timeSeries name="NWIS Time Series Instantaneous Values"> <values count="2876"> <value dateTime="2009-09-24T15:30:00.000-04:00" qualifiers="P">550</value> <value dateTime="2009-09-24T16:00:00.000-04:00" qualifiers="P">419</value> <value dateTime="2009-09-24T16:30:00.000-04:00" qualifiers="P">370</value> ….. </values> </timeSeries> </timeSeriesResponse> 我能够用硬编码的方法做我所需要的。 但是我需要我的代码更有活力。 这是什么工作: tree = ET.parse(sample.xml) doc = tree.getroot() timeseries = doc[1] values = timeseries[2] print child.attrib['dateTime'], child.text #prints 2009-09-24T15:30:00.000-04:00, 550 以下是我尝试过的一些事情,他们都没有工作,报告他们找不到timeSeries(或其他我试过的): […]
Python有几种方法来parsingXML … 我理解用SAXparsing的基础知识。 它作为一个streamparsing器,具有事件驱动的API。 我也了解DOMparsing器。 它将XML读入内存,并将其转换为可以用Python访问的对象。 一般来说,根据你需要做什么,记忆的限制,性能等,在2之间进行select是很容易的。 (希望我到目前为止是正确的)。 从Python 2.5开始,我们也有ElementTree 。 这与DOM和SAX相比如何? 哪个更类似? 为什么比以前的parsing器更好?
我想使用“findall”的方法来查找ElementTree模块中源xml文件的一些元素。 但是,源XML文件(test.xml)具有名称空间。 我截断了一部分xml文件作为示例: <?xml version="1.0" encoding="iso-8859-1"?> <XML_HEADER xmlns="http://www.test.com"> <TYPE>Updates</TYPE> <DATE>9/26/2012 10:30:34 AM</DATE> <COPYRIGHT_NOTICE>All Rights Reserved.</COPYRIGHT_NOTICE> <LICENSE>newlicense.htm</LICENSE> <DEAL_LEVEL> <PAID_OFF>N</PAID_OFF> </DEAL_LEVEL> </XML_HEADER> 示例python代码如下: from xml.etree import ElementTree as ET tree = ET.parse(r"test.xml") el1 = tree.findall("DEAL_LEVEL/PAID_OFF") # Return None el2 = tree.findall("{http://www.test.com}DEAL_LEVEL/{http://www.test.com}PAID_OFF") # Return <Element '{http://www.test.com}DEAL_LEVEL/PAID_OFF' at 0xb78b90> 虽然它可以工作,但是由于存在名称空间“{http://www.test.com}”,因此在每个标签前添加一个名称空间非常不方便。 如何在使用“find”,“findall”等方法时忽略名称空间?
我已经写了一个相当简单的filter在python中使用ElementTree模仿一些xml文件的上下文。 它或多或less起作用。 但它重新sorting各种标签的属性,我希望它不这样做。 有谁知道一个开关,我可以扔,使它们保持在指定的顺序? 上下文为此 我正在使用一个粒子物理工具,它有一个复杂的,但奇怪的基于xml文件的configuration系统。 设置这种方式的许多事情是各种静态数据文件的path。 这些path被硬编码到现有的xml中,并且没有设置或者根据环境variables来改变它们,在我们的本地安装中它们必然在不同的地方。 这不是一场灾难,因为我们使用的源码和构build控制工具可以让我们用本地副本来遮盖某些文件。 但即使认为数据字段是静态的xml不是,所以我写了一个脚本来修复path,但与属性重新排列之间的本地和主版本比较难以阅读比必要的。 这是我第一次把ElementTree旋转(只有我的第五或第六个Python项目),所以也许我只是做错了。 简单起见,代码如下所示: tree = elementtree.ElementTree.parse(inputfile) i = tree.getiterator() for e in i: e.text = filter(e.text) tree.write(outputfile) 合理还是愚蠢? 相关链接: 我如何使用Python xml.sax获取元素属性列表的顺序? 用minidom修改时保留属性的顺序
我需要用Python编写一个parsing器,它可以在没有太多内存(只有2 GB)的计算机上处理一些非常大的文件(> 2 GB)。 我想在lxml中使用iterparse来做到这一点。 我的文件的格式是: <item> <title>Item 1</title> <desc>Description 1</desc> </item> <item> <title>Item 2</title> <desc>Description 2</desc> </item> 到目前为止我的解决scheme是: from lxml import etree context = etree.iterparse( MYFILE, tag='item' ) for event, elem in context : print elem.xpath( 'description/text( )' ) del context 不幸的是,这个解决scheme仍然消耗了大量的内存。 我觉得问题是,在处理好每一个“项目”之后,我需要做些什么来清理空的孩子。 任何人都可以提供一些build议,我可以做什么后,处理我的数据妥善清理?
我正在使用内置的Python ElementTree模块。 访问孩子很简单,但父母或兄弟节点呢? – 这可以有效地完成,无需遍历整个树?