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 3.x 根据xml元素的属性/Python获取xml元素的索引_Python 3.x_Xml - Fatal编程技术网

Python 3.x 根据xml元素的属性/Python获取xml元素的索引

Python 3.x 根据xml元素的属性/Python获取xml元素的索引,python-3.x,xml,Python 3.x,Xml,我需要找出具有特定属性和名称空间的XML元素的索引(位置)。在我的XML中,有更多同名元素,所以唯一可能的方法是通过属性来识别正确的元素 这是我的XML文档的示例: <mets:mets LABEL="Moderní pedagogika, 2002" TYPE="Monograph" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:mets="http

我需要找出具有特定属性和名称空间的XML元素的索引(位置)。在我的XML中,有更多同名元素,所以唯一可能的方法是通过属性来识别正确的元素

这是我的XML文档的示例:

<mets:mets LABEL="Moderní pedagogika, 2002" TYPE="Monograph"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:mets="http://www.loc.gov/METS/"
    xmlns:mods="http://www.loc.gov/mods/v3"
    xmlns:ns3="http://www.openarchives.org/OAI/2.0/oai_dc/"
    xmlns:ns5="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema.xsd http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/mets.xsd http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd">
    <mets:metsHdr CREATEDATE="2012-12-05T07:42:22" LASTMODDATE="2012-12-05T07:42:22">
        <mets:agent ROLE="CREATOR" TYPE="ORGANIZATION">
            <mets:name>ABA001</mets:name>
        </mets:agent>
        <mets:agent ROLE="ARCHIVIST" TYPE="ORGANIZATION">
            <mets:name>ABA001</mets:name>
        </mets:agent>
    </mets:metsHdr>
    <mets:dmdSec ID="MODSMD_VOLUME_0001">
        .....   
    </mets:dmdSec>
    <mets:dmdSec ID="DCMD_VOLUME_0001"> 
        .....
    </mets:dmdSec>
</mets:mets>

ABA001
ABA001
.....   
.....
本例中所需的索引是此标记的索引

我尝试了一些关于list(root).index(dmdSec)的解决方案,但没有成功,因为我无法或不知道如何插入关于属性和名称空间的详细信息


有人能帮我解决这个问题吗?

我假设您正在使用lxml.etree库进行xml解析—如果没有,您可能需要修改一些内容—但原理是一样的:

只需使用:

编辑:

输出:
2


注意,位置是
2
,而不是
1
——xpath从1开始计数(不像python从0开始计数)。您的目标是根目录中的第二个
节点。

我假设您正在使用lxml.etree库进行xml解析—如果不是,您可能需要修改一些内容—但原理是相同的:

只需使用:

编辑:

输出:
2


注意,位置是
2
,而不是
1
——xpath从1开始计数(不像python从0开始计数)。您的目标是根中的第二个
节点。

有点不清楚-您想在什么范围内找到它的索引位置?例如,在示例xml中,预期的输出是什么?另外,您可以编辑问题并验证您使用的是格式良好的xml示例吗?谢谢您的快速回复。我使用tree=ET.parse(“sample.xml”);root=tree.getroot(),我的目标是获取“1”作为该标记的索引。所以它应该在根标记中,根标记是。有了这些信息,我就可以使用Elementtree中的函数insert(index,element)了。有点不清楚-你想在什么范围内找到它的索引位置?例如,在示例xml中,预期的输出是什么?另外,您可以编辑问题并验证您使用的是格式良好的xml示例吗?谢谢您的快速回复。我使用tree=ET.parse(“sample.xml”);root=tree.getroot(),我的目标是获取“1”作为该标记的索引。所以它应该在根标记中,根标记是。有了这些信息,我可以使用Elementtree中的函数insert(index,element)。是的,我使用了前面提到的库,但是我还是遇到了一个错误。你知道会出什么问题吗?position=int(root.xpath(//*[@ID=“MODSMD_VOLUME_0001”]/前面的同级::*)+1')AttributeError:'xml.etree.ElementTree.Element'对象没有属性“xpath”@JonášKvět您正在使用另一个库。您应该使用lxml。请参阅编辑。是的,我使用了提到的库,但我还是会收到一个错误。你知道会出什么问题吗?position=int(root.xpath(//*[@ID=“MODSMD_VOLUME_0001”]/前面的同级::*)+1')AttributeError:'xml.etree.ElementTree.Element'对象没有属性“xpath”@JonášKvět您正在使用另一个库。您应该使用lxml。请参见编辑。
from lxml import etree
root = etree.parse(r'path\to\your\file.xml')
int(root.xpath('count(//*[@ID="MODSMD_VOLUME_0001"]/preceding-sibling::*)+1'))