Python 3.x 根据xml元素的属性/Python获取xml元素的索引
我需要找出具有特定属性和名称空间的XML元素的索引(位置)。在我的XML中,有更多同名元素,所以唯一可能的方法是通过属性来识别正确的元素 这是我的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
<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'))