xml - 无法在 xml 中找到具有命名空间的元素

标签 xml python-3.x xpath lxml xml-namespaces

我正在使用 python 3.5 中的 lxml 库来解析 xml 文件。 xml内容为:

xml_content = """
<wps:ExecuteResponse xmlns:gml="http://www.opengis.net/gml"
xmlns:ows="http://www.opengis.net/ows/1.1"
xmlns:wps="http://www.opengis.net/wps/1.0.0"
xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 
http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd"
service="WPS" version="1.0.0" xml:lang="en-US" 
serviceInstance="http://192.168.2.72:5000/wps?service=WPS&amp;request=GetCapabilities" statusLocation="http://192.168.2.72:5000/output/9fbbf322-496d-11e8-9a87-0242ac110002.xml">
<wps:Process wps:processVersion="None">
  <ows:Identifier>run_checks</ows:Identifier>
  <ows:Title>Run checks process</ows:Title>
  <ows:Abstract>Process performing qc tool checks.</ows:Abstract>
</wps:Process>
<wps:Status creationTime="2018-04-26T16:19:41Z">
  <wps:ProcessSucceeded>PyWPS Process Run checks process finished</wps:ProcessSucceeded>
</wps:Status>
<wps:DataInputs>
  <wps:Input>
    <ows:Identifier>filepath</ows:Identifier>
    <ows:Title>Local filesystem path to the product to be checked.</ows:Title>
      <wps:Data>
        <wps:LiteralData dataType="string">/mnt/bubu/bebe</wps:LiteralData>
      </wps:Data>
   </wps:Input>
  <wps:Input>
    <ows:Identifier>product_type_name</ows:Identifier>
    <ows:Title>The type of the product denoting group of checks to be performed.</ows:Title>
    <wps:Data>
      <wps:LiteralData dataType="string">dummy</wps:LiteralData>
    </wps:Data>
  </wps:Input>
  <wps:Input>
    <ows:Identifier>optional_check_idents</ows:Identifier>
    <ows:Title>Comma separated identifiers of optional checks to be performed.</ows:Title>
    <wps:Data>
      <wps:LiteralData dataType="string">dummy</wps:LiteralData>
    </wps:Data>
  </wps:Input>
</wps:DataInputs>
<wps:OutputDefinitions>
  <wps:Output>
    <ows:Identifier>result</ows:Identifier>
    <ows:Title>Result of passed checks in json format.</ows:Title>
  </wps:Output>
</wps:OutputDefinitions>
<wps:ProcessOutputs>
  <wps:Output>
    <ows:Identifier>result</ows:Identifier>
    <ows:Title>Result of passed checks in json format.</ows:Title>
    <wps:Data>
      <wps:LiteralData dataType="urn:ogc:def:dataType:OGC:1.1:string"> {"dummy": {"status": "ok", "message": "Dummy check has passed.", "params":   "{'dummy_param1': 'dummy value1', 'dummy_param2': 'dummy value2'}"}}
     </wps:LiteralData>
  </wps:Data>
  </wps:Output>
</wps:ProcessOutputs>
</wps:ExecuteResponse>
"""

我解析文件的Python代码是:

from lxml import etree

ns = {'wps': 'http://www.opengis.net/wps/1.0.0', 
      'ows': 'http://schemas.opengis.net/ows/1.1.0'}
tree = etree.fromstring(xml_content)

# this works, the wps:Process tag is found successfully
wps_process_tag = tree.xpath('//wps:Process', namespaces=ns)
if len(wps_process_tag) > 0:
    print('wps:Process tag found!')

# this does not work and the ows:Identifier tag is not found
ows_identifier_tag = tree.xpath('//wps:Process/ows:Identifier', namespaces=ns)
if len(ows_identifier_tag) > 0:
    print('ows:Identifier tag found!')
else:
    print('ows:Identifier tag not found!')

如我的示例代码所示,正确找到了 wps:Process 标记。另一方面,虽然 ows:Identifier 标签存在于 xml 文档中的 wps:Process 正下方,但未找到该标签。我已向 tree.xpath 函数提供了命名空间字典,以便从 wps 和 ows 命名空间中查找元素。但它只找到以 wps: 开头的元素,而找不到以 ows:

开头的元素

我检查了 URL http://schemas.opengis.net/ows/1.1.0/它似乎是一个有效的 URL。

如何使用 lxml 查找 ows:Identifier 元素?

最佳答案

在您的代码中,您将像这样声明 ows 命名空间:

'ows': 'http://schemas.opengis.net/ows/1.1.0'

但在 XML 中,ows 命名空间声明了不同的 URI:http://www.opengis.net/ows/1.1

更正代码中的 URI 应该可以解决该问题。

关于xml - 无法在 xml 中找到具有命名空间的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059804/

相关文章:

c# - 就地修改 XML 文件?

xml - 从 PL/SQl 中的 xml 中提取元素

python - 测试在python中调用两次的函数

python-3.x - 无法在 databricks 上安装 pyomo 求解器 ipopt

javascript - NightwatchJS 中的 xPath 问题

html - AJAX 响应 : Data (JSON, XML)或 HTML 片段?

java - Android:使用 ActionBar 时出现 NullPointerException

php - XPath和PHP:没有正常工作

python - Python 3 中的 SQLAlchemy "def print_usage()"错误

javascript - 无法使用 DOM 节点的属性作为 XPath/CSS 选择器查询的过滤器