当前位置: 首页 > 面试题库 >

Python-在Python中通过“ElementTree”解析带有名称空间的XML

钮承恩
2023-03-14
问题内容

我有以下要使用Python解析的XML 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>

我想找到所有owl:Class标签,然后提取其中所有rdfs:label实例的值。我正在使用以下代码:

tree = ET.parse("filename")
root = tree.getroot()
root.findall('owl:Class')

由于命名空间的原因,出现以下错误。

SyntaxError: prefix 'owl' not found in prefix map

请让我知道如何更改代码以查找所有owl:Class标签。


问题答案:

ElementTree对名称空间不太聪明。你需要给的.find(),findall()和iterfind()方法的明确的命名空间字典。这没有很好的记录:

namespaces = {'owl': 'http://www.w3.org/2002/07/owl#'} # add more as needed

root.findall('owl:Class', namespaces)

前缀仅在namespaces你传入的参数中查找。这意味着你可以使用任何喜欢的名称空间前缀;API会分开owl:一部分,在namespaces字典中查找相应的名称空间URL ,然后更改搜索以查找XPath表达式{http://www.w3.org/2002/07/owl}Class。当然,你也可以自己使用相同的语法:

root.findall('{http://www.w3.org/2002/07/owl#}Class')

如果可以切换到lxml库,那就更好了;该库支持相同的ElementTree API,但会在.nsmap元素的属性中为你收集名称空间。



 类似资料:
  • 问题内容: 有没有一种方法可以在python ElementTree中定义默认/无前缀的命名空间?这似乎不起作用… 这也不是: 可以,但是我必须在每个元素前加上前缀: 在OSX上使用Python 3.5。 编辑:如果答案为“否”,您仍然可以获得赏金:-)。我只是想要一个花了很多时间使用它的人的明确“否”。 问题答案: 没有简单的方法可以透明地处理默认名称空间。正如您已经提到的,为空名称空间分配非空

  • 问题内容: 我试图发出带有元素树的XML文件,其中包含XML声明和名称空间。这是我的示例代码: 但是,既不会出现标签,也不会出现任何名称空间/前缀信息。我在这里有点困惑。 问题答案: 尽管文档另有说明,但我只能通过同时指定xml_declaration和编码来获得声明。 您必须在已注册的名称空间中声明节点,以在文件中的节点上获取名称空间。这是您的代码的固定版本: 输出(page.xml) Elem

  • 问题内容: 假设有一个文件夹“ / home / user / temp/a40bd22344”。名称是完全随机的,并且在每次迭代中都会更改。我需要能够使用固定名称(例如“ project”)在Python中导入此文件夹。我知道我可以将此文件夹添加到sys.path中以启用导入查找,但是有没有一种方法可以将“a40bd22344”替换为“项目”? 也许 init .py有一些聪明的技巧? 添加:

  • 我有一个来自外部endpoint的巨大XML响应。我想解析java类的XML响应。如果没有一个XML有名称空间,我就能够解析成相应的POJOS,直到那时一切都很好。 但是,响应可能仅在根元素中包含命名空间。例如,像这样 我可以保证没有一个内部xml元素会有更多的命名空间。 有没有办法实现这一点?我看到一些完全忽略命名空间的答案,但感觉不是很有说服力。有没有办法正确解析这些。 这是我为XML响应建模

  • 问题内容: 我正在尝试像在Python中一样解析时间戳字符串,但是在寻找一种可以处理缩写时区的解决方案时遇到了麻烦。 我正在使用的功能,但无法解析时区。是否有捷径可寻? 问题答案: 这可能不起作用,因为这些缩写不是唯一的。有关详情,请参见此页面。如果使用一组已知的输入,则可能只需要自己手动处理即可。

  • 问题内容: 我很难找到一个很好的基本示例,说明如何使用元素树在python中解析XML。据我所知,这似乎是用于解析XML的最简单的库。这是我正在使用的XML的示例: 我可以使用硬编码的方法来做我需要的事情。但是我需要我的代码更具动态性。这是起作用的: 这是我尝试过的几件事,但都没有奏效,报告他们找不到timeSeries(或我尝试过的其他任何东西): 基本上,我想加载xml文件,搜索timeSer