我有以下XML,我想用Python解析ElementTree:
<rdf:RDF xml:base="http://dbpedia.org/ontology/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns="http://dbpedia.org/ontology/">
<owl:Class rdf:about="http://dbpedia.org/ontology/BasketballLeague">
<rdfs:label xml:lang="en">basketball league</rdfs:label>
<rdfs:comment xml:lang="en">
a group of sports teams that compete against each other
in Basketball
</rdfs:comment>
</owl:Class>
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)
我想找到所有owl:Class标签,然后提取其中所有rdfs:label实例的值.我使用以下代码:
tree = ET.parse("filename")
root = tree.getroot()
root.findall('owl:Class')
Run Code Online (Sandbox Code Playgroud)
由于命名空间,我收到以下错误.
SyntaxError: prefix 'owl' not found in prefix map
Run Code Online (Sandbox Code Playgroud)
我尝试在http://effbot.org/zone/element-namespaces.htm上阅读该文档,但由于上述XML具有多个嵌套命名空间,因此我仍然无法正常工作.
请告诉我如何更改代码以查找所有owl:Class标签.
我想使用"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>
Run Code Online (Sandbox Code Playgroud)
示例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>
Run Code Online (Sandbox Code Playgroud)
虽然它可以工作,因为有一个名称空间"{http://www.test.com}",在每个标记前面添加一个名称空间是非常不方便的.
使用"find","findall"等方法时,如何忽略命名空间?
Python有几种解析XML的方法......
我理解使用SAX解析的基础知识.它充当流解析器,具有事件驱动的API.
我也理解DOM解析器.它将XML读入内存并将其转换为可以使用Python访问的对象.
一般来说,根据你需要做什么,内存限制,性能等,很容易在两者之间做出选择.
(希望到目前为止我是正确的.)
从Python 2.5开始,我们也有了ElementTree.这与DOM和SAX相比如何?哪个更相似?为什么它比以前的解析器更好?
每当我打电话时ElementTree.tostring(e),都会收到以下错误消息:
AttributeError: 'Element' object has no attribute 'getroot'
Run Code Online (Sandbox Code Playgroud)
有没有其他方法将ElementTree对象转换为XML字符串?
追溯:
Traceback (most recent call last):
File "Development/Python/REObjectSort/REObjectResolver.py", line 145, in <module>
cm = integrateDataWithCsv(cm, csvm)
File "Development/Python/REObjectSort/REObjectResolver.py", line 137, in integrateDataWithCsv
xmlstr = ElementTree.tostring(et.getroot(),encoding='utf8',method='xml')
AttributeError: 'Element' object has no attribute 'getroot'
Run Code Online (Sandbox Code Playgroud) 我很难找到一个如何使用Element Tree在python中解析XML的基本示例.根据我的发现,这似乎是用于解析XML的最简单的库.以下是我正在使用的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>
Run Code Online (Sandbox Code Playgroud)
我能够使用硬编码方法做我需要的事情.但我需要我的代码更有活力.这是有效的:
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
Run Code Online (Sandbox Code Playgroud)
以下是我尝试过的一些事情,其中没有一个有效,报告说他们找不到时间序列(或我尝试过的任何其他内容):
tree = ET.parse(sample.xml)
tree.find('timeSeries')
tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')
Run Code Online (Sandbox Code Playgroud)
基本上,我想加载xml文件,搜索timeSeries标记,并遍历值标记,返回dateTime和标记本身的值; 我在上面的例子中所做的一切,但不是硬编码我感兴趣的xml部分.有人能指出我的一些例子,或者给我一些关于如何解决这个问题的建议?
谢谢你的帮助.使用以下两个建议对我提供的示例文件起作用,但是,它们不能在完整文件上工作.这是我使用Ed Carrel的方法从真实文件中得到的错误:
(<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)
Run Code Online (Sandbox Code Playgroud)
我认为在它不喜欢的真实文件中有一些东西,所以我逐渐删除了东西直到它工作.以下是我更改的行: …
我正在使用内置的Python ElementTree模块.访问子节点很简单,但父节点或兄弟节点呢? - 这可以在不遍历整棵树的情况下有效地完成吗?
我有一个xml doc,我试图使用Etree.lxml解析
<Envelope xmlns="http://www.example.com/zzz/yyy">
<Header>
<Version>1</Version>
</Header>
<Body>
some stuff
<Body>
<Envelope>
Run Code Online (Sandbox Code Playgroud)
我的代码是:
path = "path to xml file"
from lxml import etree as ET
parser = ET.XMLParser(ns_clean=True)
dom = ET.parse(path, parser)
dom.getroot()
Run Code Online (Sandbox Code Playgroud)
当我尝试获取dom.getroot()时,我得到:
<Element {http://www.example.com/zzz/yyy}Envelope at 28adacac>
Run Code Online (Sandbox Code Playgroud)
但是我只想要:
<Element Envelope at 28adacac>
Run Code Online (Sandbox Code Playgroud)
当我做
dom.getroot().find("Body")
Run Code Online (Sandbox Code Playgroud)
我没有得到任何回报.但是,当我
dom.getroot().find("{http://www.example.com/zzz/yyy}Body")
Run Code Online (Sandbox Code Playgroud)
我得到了一个结果.
我认为将ns_clean = True传递给解析器会阻止这种情况.
有任何想法吗?
我正在使用Python在Python中生成XML文档ElementTree,但该tostring函数在转换为纯文本时不包含XML声明.
from xml.etree.ElementTree import Element, tostring
document = Element('outer')
node = SubElement(document, 'inner')
node.NewValue = 1
print tostring(document) # Outputs "<outer><inner /></outer>"
Run Code Online (Sandbox Code Playgroud)
我需要我的字符串包含以下XML声明:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
Run Code Online (Sandbox Code Playgroud)
但是,似乎没有任何记录的方法可以做到这一点.
是否有适当的方法来呈现XML声明ElementTree?
我试图xml.etree.elementtree用Python写出xml文件.问题在于它们不断生成一行.我希望能够轻松地引用它们,所以如果它可能我真的希望能够干净利落地写出来.
这就是我得到的
<Language><En><Port>Port</Port><UserName>UserName</UserName></En><Ch><Port>IP??</Port><UserName>????</UserName></Ch></Language>
Run Code Online (Sandbox Code Playgroud)
这是我想看到的.
<Language>
<En>
<Port>Port</Port>
<UserName>UserName</UserName>
</En>
<Ch>
<Port>IP??</Port>
<UserName>????</UserName>
</Ch>
</Language>
Run Code Online (Sandbox Code Playgroud) 我正在尝试开发简单的Python(3.2)代码来读取XML文件,进行一些修正并将其存储回来.但是,在存储步骤中,ElementTree会添加此命名空间命名法.例如:
<ns0:trk>
<ns0:name>ACTIVE LOG</ns0:name>
<ns0:trkseg>
<ns0:trkpt lat="38.5" lon="-120.2">
<ns0:ele>6.385864</ns0:ele>
<ns0:time>2011-12-10T17:46:30Z</ns0:time>
</ns0:trkpt>
<ns0:trkpt lat="40.7" lon="-120.95">
<ns0:ele>5.905273</ns0:ele>
<ns0:time>2011-12-10T17:46:51Z</ns0:time>
</ns0:trkpt>
<ns0:trkpt lat="43.252" lon="-126.453">
<ns0:ele>7.347168</ns0:ele>
<ns0:time>2011-12-10T17:52:28Z</ns0:time>
</ns0:trkpt>
</ns0:trkseg>
</ns0:trk>
Run Code Online (Sandbox Code Playgroud)
代码段如下:
def parse_gpx_data(gpxdata, tzname=None, npoints=None, filter_window=None,
output_file_name=None):
ET = load_xml_library();
def find_trksegs_or_route(etree, ns):
trksegs=etree.findall('.//'+ns+'trkseg')
if trksegs:
return trksegs, "trkpt"
else: # try to display route if track is missing
rte=etree.findall('.//'+ns+'rte')
return rte, "rtept"
# try GPX10 namespace first
try:
element = ET.XML(gpxdata)
except ET.ParseError as v:
row, column = v.position
print ("error on …Run Code Online (Sandbox Code Playgroud) elementtree ×10
python ×10
xml ×6
xml-parsing ×2
dom ×1
find ×1
findall ×1
lxml ×1
marshalling ×1
namespaces ×1
sax ×1