Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用元素树解析XML文件_Python_Xml_Parsing_Elementtree - Fatal编程技术网

Python 使用元素树解析XML文件

Python 使用元素树解析XML文件,python,xml,parsing,elementtree,Python,Xml,Parsing,Elementtree,我有大量的.xml文件(大约70个),我需要从中提取一些坐标。 显然,最好的方法是使用元素树解析xml文件。我是python新手(非常非常新!),很难理解元素树附带的所有文档! 我想知道是否有人在使用元素树的地方有任何代码,或者是否有人可以向我解释如何使用元素树。。 谢谢大家! 这是我的XML文件中的一个示例 <?xml version="1.0" encoding="UTF-8" ?> - <lev:Leveringsinformatie xmlns:lev="ht

我有大量的.xml文件(大约70个),我需要从中提取一些坐标。 显然,最好的方法是使用元素树解析xml文件。我是python新手(非常非常新!),很难理解元素树附带的所有文档! 我想知道是否有人在使用元素树的地方有任何代码,或者是否有人可以向我解释如何使用元素树。。 谢谢大家!

这是我的XML文件中的一个示例

    <?xml version="1.0" encoding="UTF-8" ?> 
- <lev:Leveringsinformatie xmlns:lev="http://www.kadaster.nl/schemas/klic/20080722/leveringsinfo">
  <lev:Version>1.5</lev:Version> 
  <lev:Klicnummer>10G179900</lev:Klicnummer> 
  <lev:Ordernummer>0065491624</lev:Ordernummer> 
  <lev:RelatienummerGrondroerder>0000305605</lev:RelatienummerGrondroerder> 
  <lev:Leveringsvolgnummer>1</lev:Leveringsvolgnummer> 
  <lev:Meldingsoort>Graafmelding</lev:Meldingsoort> 
  <lev:DatumTijdAanvraag>2010-08-10T11:43:02.779+02:00</lev:DatumTijdAanvraag> 
  <lev:KlantReferentie>1207-0132-030 - 6</lev:KlantReferentie> 
- <lev:Locatie axisLabels="x y" srsDimension="2" srsName="epsg:28992" uomLabels="m m">
- <gml:exterior xmlns:gml="http://www.opengis.net/gml">
- <gml:LinearRing>
  <gml:posList>137800.0 484217.0 137796.0 484222.0 137832.0 483757.0 138178.0 483752.0 138174.0 484222.0 137800.0 484217.0</gml:posList> 
  </gml:LinearRing>
  </gml:exterior>
  </lev:Locatie>
- <lev:Pngformaat>
- <lev:OmsluitendeRechthoek xmlns:ns4="http://www.kadaster.nl/schemas/klic/20080722/madt" xmlns:bis="http://www.kadaster.nl/schemas/klic/20080722/klicnetbeheerdersinformatieservicetypes" xmlns:ns0="http://www.kadaster.nl/schemas/klic/20080722/gias" xmlns:ns7="http://www.kadaster.nl/schemas/klic/20080722/klicnetbeheerdersinformatieservicetypes" xmlns:madt="http://www.kadaster.nl/schemas/klic/20080722/madt" xmlns:gia="http://www.kadaster.nl/schemas/klic/20080722/gias" xmlns:klic="http://www.kadaster.nl/schemas/20080722/klic" xmlns:b="http://www.kadaster.nl/schemas/klic/20080722/bundelingtypes" xmlns:ns9="http://www.kadaster.nl/schemas/klic/20081010/bmkltypes" xmlns:gml="http://www.opengis.net/gml" xmlns:ns1="http://www.kadaster.nl/schemas/20080722/klic" xmlns:a="http://www.kadaster.nl/schemas/klic/20080722/bundelingservicetypes" xmlns:bmkl="http://www.kadaster.nl/schemas/klic/20081010/bmkltypes" xmlns:ns3="http://www.opengis.net/gml" xmlns:ns8="http://www.kadaster.nl/schemas/klic/20080722/knts">
- <gml:Envelope srsDimension="2" srsName="epsg:28992">
  <gml:lowerCorner>137796 483752</gml:lowerCorner> 
  <gml:upperCorner>138178 484222</gml:upperCorner> 
  </gml:Envelope>
  </lev:OmsluitendeRechthoek>
  <lev:PixelsBreed>5348</lev:PixelsBreed> 
  <lev:PixelsHoog>6580</lev:PixelsHoog> 
  </lev:Pngformaat>
- <lev:NetbeheerderLeveringen>
- <lev:NetbeheerderLevering>
  <lev:RelatienummerNetbeheerder>0000578695</lev:RelatienummerNetbeheerder> 
  <lev:Bedrijfsnaam>Gemeente Almere</lev:Bedrijfsnaam> 
  <lev:BedrijfsnaamAfkorting>Gemeente Almere</lev:BedrijfsnaamAfkorting> 
我现在得到一个错误:

消息文件名行位置
回溯
D:\J040083\TXT_EXTRACTION.py 32
解析C:\Python25\Lib\xml\etree\ElementTree.py 862
解析C:\Python25\Lib\xml\etree\ElementTree.py 579
IOError:[Errno 13]权限被拒绝:“D:/J040083”


现在我真的很困惑,因为我可以用一个不同的脚本访问这些文件,这个脚本几乎和这个脚本完全一样

使用ElementTree非常简单,基本上您可以创建一个从文件解析的对象,按名称或路径查找元素,并获取它们的文本或属性

在您的例子中,它有点复杂,因为您的文件中有名称空间,所以我们必须将路径从表单
ns:tag
转换为表单
{uri}tag
。这是
变换路径
功能的目标

NS_MAP = {
    'http://www.kadaster.nl/schemas/klic/20080722/leveringsinfo' : 'lev',
    'http://www.opengis.net/gml' : 'gml',
}
INV_NS_MAP = {v:k for k, v in NS_MAP.items()} #inverse ns_map 
#for python2: INV_NS_MAP = dict((v,k) for k, v in NS_MAP.iteritems())

#ElementTree expect tags in form {uri}tag, but it would be a pain to have complete uri for eache tag
def transform_path (path):
    res = ''
    tags = path.split('/')
    for tag in tags:
      ns, tag = tag.split(':')
      res += "{"+INV_NS_MAP[ns]+"}"+tag+'/'
    return res

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
doc = tree.getroot()

lowerCorner = doc.find(transform_path("lev:Pngformaat/lev:OmsluitendeRechthoek/gml:Envelope/gml:lowerCorner"))
upperCorner = doc.find(transform_path("lev:Pngformaat/lev:OmsluitendeRechthoek/gml:Envelope/gml:upperCorner"))
print (lowerCorner.text)         # Print coordinates
print (upperCorner.text)         # Print coordinates

#for python2: print elem.text
使用文件运行脚本将提供以下输出:

137796 483752
138178 484222

当涉及名称空间时,ElementTree可能很棘手。您要查找的元素名为
。在XML数据中搜索更高的位置,
gml
被定义为一个XML名称空间:
xmlns:gml=”http://www.opengis.net/gml“
。查找XML树的子元素的方法如下:

from xml.etree import ElementTree as ET
tree = ET.parse('file.xml')
print tree.find('//{http://www.opengis.net/gml}lowerCorner').text
print tree.find('//{http://www.opengis.net/gml}upperCorner').text
输出 解释 使用ElementTree的支持,
/
选择树的所有级别上的所有子元素。ElementTree对特定命名空间中的标记使用
{url}标记
表示法<代码>gml的URL是
http://www.opengis.net/gml
.text
检索元素中的数据

请注意,
/
是查找嵌套节点的快捷方式。ElementTree语法中
上角的完整路径实际上是:

{http://www.kadaster.nl/schemas/klic/20080722/leveringsinfo}Pngformaat/{http://www.kadaster.nl/schemas/klic/20080722/leveringsinfo}OmsluitendeRechthoek/{http://www.opengis.net/gml}Envelope/{http://www.opengis.net/gml}upperCorner

就这样我们都在同一页上,你读了吗?这是一个参考文件,但在整个页面中都有一些例子。作为一个介绍,这一页可能也会有帮助。令人尴尬的是,我已经读过了!我只是不太理解它。@Alice:我建议您从一个XML文件中发布一个小的、真实的片段,以解析并指定要访问的数据。你可以通过编辑自己的帖子来实现。我确实尝试过,但它只是以不正确的格式出现在我的问题中。。因此,它没有评论,而是有数字@Alice Duff—如果您打算在GML上做大量工作,那么我建议您阅读XML。GML可能会变得相当复杂,您会很高兴能够理清XML基础知识。我不能推荐任何教程,因为我已经有一段时间没有看过它们了,但是要避免使用W3学校(与W3没有联系,W3实际上是编写规范的!),因为它们经常不准确。这是第一个不是W3Schools的结果:谢谢Charles,我正在尝试运行您的代码,但它一直给我最后一行的错误“无效语法”!我在制作这个脚本时遇到了一些困难。。现在,我在最后一行的第二行出现了一个“无效语法”错误。我认为它应该可以工作。我只是不知道如何使它与我的数据一起工作-我将尝试做一些研究,希望我能理解!!我制作了一个小脚本,读取文件+1的坐标,以便进行很好的解释。我唯一不确定的是,每个文档是否最多有一个gml:信封,也许Alice可以发表评论?哦,万岁万岁!!它起作用了!!XML的其余部分只是人名和电子邮件地址——所以我认为我向您展示的部分是唯一的gml部分——如果这就是您的意思,詹姆斯?我现在必须将输出保存在预定义的excel文件中!非常感谢大家!如果答案可以接受,请检查是否接受。很高兴能帮上忙。:)嗨,马克!我不得不取消选中你的答案,因为我有一个新问题——或者我应该把它作为一个新问题发布?
137796 483752
138178 484222
{http://www.kadaster.nl/schemas/klic/20080722/leveringsinfo}Pngformaat/{http://www.kadaster.nl/schemas/klic/20080722/leveringsinfo}OmsluitendeRechthoek/{http://www.opengis.net/gml}Envelope/{http://www.opengis.net/gml}upperCorner