Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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中使用xpath查询具有名称空间的xml数据_Python_Xml_Xpath_Lxml_Xml Namespaces - Fatal编程技术网

如何在python中使用xpath查询具有名称空间的xml数据

如何在python中使用xpath查询具有名称空间的xml数据,python,xml,xpath,lxml,xml-namespaces,Python,Xml,Xpath,Lxml,Xml Namespaces,我尝试使用以下代码对具有名称空间的XML数据应用XPath查询: from lxml import etree from io import StringIO xml = ''' <gpx creator="udos" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

我尝试使用以下代码对具有名称空间的XML数据应用XPath查询:

from lxml import etree
from io import StringIO

xml = '''
<gpx creator="udos" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
 <metadata>
  <time>2015-07-07T15:16:40Z</time>
 </metadata>
 <trk>
  <name>some name</name>
  <trkseg>
   <trkpt lat="46.3884140" lon="10.0286290">
    <ele>2261.8</ele>
    <time>2015-07-07T15:30:42Z</time>
   </trkpt>
   <trkpt lat="46.3884050" lon="10.0286240">
    <ele>2261.6</ele>
    <time>2015-07-07T15:30:43Z</time>
   </trkpt>
   <trkpt lat="46.3884000" lon="10.0286210">
    <ele>2262.0</ele>
    <time>2015-07-07T15:30:46Z</time>
   </trkpt>
   <trkpt lat="46.3884000" lon="10.0286210">
    <ele>2261.8</ele>
    <time>2015-07-07T15:30:47Z</time>
   </trkpt>
  </trkseg>
 </trk>
</gpx>
'''

# this is to simulate that above xml was read from a file
file = StringIO(unicode(xml))   # with python 3 use "file = StringIO(xml)"

# reading the xml from a file
tree = etree.parse(file)

ns = {'xmlns': 'http://www.topografix.com/GPX/1/1',
      'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
      'xmlns:gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
      'xmlns:gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}

expr = 'trk/trkseg/trkpt/ele'

for element in tree.xpath(expr, namespaces=ns):
    print(element.text)
从lxml导入etree
从io导入StringIO
xml=“”
2015-07-07T15:16:40Z
某个名字
2261.8
2015-07-07T15:30:42Z
2261.6
2015-07-07T15:30:43Z
2262
2015-07-07T15:30:46Z
2261.8
2015-07-07T15:30:47Z
'''
#这是为了模拟上述xml是从文件中读取的
file=StringIO(unicode(xml))#对于python3,使用“file=StringIO(xml)”
#从文件中读取xml
tree=etree.parse(文件)
ns={'xmlns':'http://www.topografix.com/GPX/1/1',
'xmlns:xsi':'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:gpxtpx':'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
'xmlns:gpxx':'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}
expr='trk/trkseg/trkpt/ele'
对于tree.xpath(expr,namespaces=ns)中的元素:
打印(element.text)
我希望代码有以下输出:

2261.8
2261.6
2262.0
2261.8

替换XML根元素时

<gpx creator="udos" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">


代码正在运行


您对如何使其与名称空间一起工作有何建议?

您可以将名称空间定义为-

ns = {'n': 'http://www.topografix.com/GPX/1/1',
      'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
      'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
      'gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}
这将定义
的前缀http://www.topografix.com/GPX/1/1“
作为
n
,然后在XPath查询中,可以使用该前缀。范例-

expr = 'n:trk/n:trkseg/n:trkpt/n:ele'

for element in tree.xpath(expr, namespaces=ns):
        print(element.text)
这是因为根节点的xmlns是-
'http://www.topografix.com/GPX/1/1“
-因此,除非子节点使用不同的前缀或指定自己的名称空间,否则所有子节点都会自动将其作为xmlns(名称空间)继承

示例/演示-

In [44]: ns = {'n': 'http://www.topografix.com/GPX/1/1',
   ....:       'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
   ....:       'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
   ....:       'gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}

In [45]:

In [45]: expr = 'n:trk/n:trkseg/n:trkpt/n:ele'

In [46]: for element in tree.xpath(expr, namespaces=ns):
   ....:         print(element.text)
   ....:
2261.8
2261.6
2262.0
2261.8

这意味着我把xpath查询搞砸了。不是使用<代码> ExpR= Trk/TrkSEG/TrkPt/ELE’< /代码>我应该使用<代码> ExpR= 'xMLNs:Trk/XMLN:TrkSEG/XMLN:TrkPt/XMLN:ELE’< /Cord>来考虑“空白”命名空间。有人能帮助我吗?请
In [44]: ns = {'n': 'http://www.topografix.com/GPX/1/1',
   ....:       'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
   ....:       'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
   ....:       'gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}

In [45]:

In [45]: expr = 'n:trk/n:trkseg/n:trkpt/n:ele'

In [46]: for element in tree.xpath(expr, namespaces=ns):
   ....:         print(element.text)
   ....:
2261.8
2261.6
2262.0
2261.8