0

我只是想编写一个简单的程序来解析以下一些 XML。到目前为止,在以下示例中,我没有得到我正在寻找的结果。

我遇到了许多这样的 XML 文件,并且我通常想要一些标签之后的信息。使用 elementtree 能够搜索<Id>和获取该标签中的任何信息的最佳方式是什么。我正在尝试类似的事情

for Reel in root.findall('Reel'):
...     id = Reel.findtext('Id')
...     print id

有没有办法只寻找<Id>并抓住 urn: etc 之后的每个实例?一些遍历所有内容并查找的代码<what I want>等等。

这是我通常处理的非常精简的版本。

这根本没有得到我想要的。是否有一个简单的匹配<what I want>任何 XML 文件并获取该标记的内容,或者我是否需要足够了解 XML 的结构以了解它与根/子等的关系?

 <Reel>
 <Id>urn:uuid:632437bc-73f9-49ca-b687-fdb3f98f430c</Id>
 <AssetList>
  <MainPicture>
   <Id>urn:uuid:46afe8a3-50be-4986-b9c8-34f4ba69572f</Id>
   <EditRate>24 1</EditRate>
   <IntrinsicDuration>340</IntrinsicDuration>
   <EntryPoint>0</EntryPoint>
   <Duration>340</Duration>
   <FrameRate>24 1</FrameRate>
   <ScreenAspectRatio>2048 858</ScreenAspectRatio>
  </MainPicture>
  <MainSound>
   <Id>urn:uuid:1fce0915-f8c7-48a7-b023-36e204a66ed1</Id>
   <EditRate>24 1</EditRate>
   <IntrinsicDuration>340</IntrinsicDuration>
   <EntryPoint>0</EntryPoint>
   <Duration>340</Duration>
  </MainSound>
 </AssetList>
</Reel>

@Mata 效果很好,但是当我尝试将其用于另一个 XML 文件上的不同值时,我脸色难看。例如,文件的这一部分怎么样。不幸的是,我无法发布整个内容。如果我想获取 KeyId 之后的内容怎么办?

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><DCinemaSecurityMessage xmlns="http://www.digicine.com/PROTO-ASDCP-KDM-20040311#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#">
  <!-- Generated by Wailua Version 0.3.20 -->
  <AuthenticatedPublic Id="ID_AuthenticatedPublic">
    <MessageId>urn:uuid:7bc63f4c-c617-4d00-9e51-0c8cd6a4f59e</MessageId>
    <MessageType>http://www.digicine.com/PROTO-ASDCP-KDM-20040311#</MessageType>
    <AnnotationText>SPIDERMAN-3_FTR_S_EN-XX_US-13_51_4K_PH_20070423_DELUXE ~ KDM for Quvis-10010.pem</AnnotationText>
    <IssueDate>2007-04-29T04:13:43-00:00</IssueDate>
    <Signer>
      <dsig:X509IssuerName>dnQualifier=BzC0n/VV/uVrl2PL3uggPJ9va7Q=,CN=.deluxe-admin-c,OU=.mxf-j2c.ca.cinecert.com,O=.ca.cinecert.com</dsig:X509IssuerName>
      <dsig:X509SerialNumber>10039</dsig:X509SerialNumber>
    </Signer>
    <RequiredExtensions>
      <Recipient>
        <X509IssuerSerial>
          <dsig:X509IssuerName>dnQualifier=RUxyQle0qS7qPbcNRFBEgVjw0Og=,CN=SM.QuVIS.com.001,OU=QuVIS Digital Cinema,O=QuVIS.com</dsig:X509IssuerName>
          <dsig:X509SerialNumber>363</dsig:X509SerialNumber>
        </X509IssuerSerial>
        <X509SubjectName>CN=SM MD LE FM.QuVIS_CinemaPlayer-3d_10010,OU=QuVIS,O=QuVIS.com,dnQualifier=3oBfjTfx1me0p1ms7XOX\+eqUUtE=</X509SubjectName>
      </Recipient>
      <CompositionPlaylistId>urn:uuid:336263da-e4f1-324e-8e0c-ebea00ff79f4</CompositionPlaylistId>
      <ContentTitleText>SPIDERMAN-3_FTR_S_EN-XX_US-13_51_4K_PH_20070423_DELUXE</ContentTitleText>
      <ContentKeysNotValidBefore>2007-04-30T05:00:00-00:00</ContentKeysNotValidBefore>
      <ContentKeysNotValidAfter>2007-04-30T10:00:00-00:00</ContentKeysNotValidAfter>
      <KeyIdList>
        <KeyId>urn:uuid:9851b0f6-4790-0d4c-a69d-ea8abdedd03d</KeyId>
        <KeyId>urn:uuid:8317e8f3-1597-494d-9ed8-08a751ff8615</KeyId>
        <KeyId>urn:uuid:5d9b228d-7120-344c-aefc-840cdd32bbfc</KeyId>
        <KeyId>urn:uuid:1e32ccb2-ab0b-9d43-b879-1c12840c178b</KeyId>
        <KeyId>urn:uuid:44d04416-676a-2e4f-8995-165de8cab78d</KeyId>
        <KeyId>urn:uuid:906da0c1-b0cb-4541-b8a9-86476583cdc4</KeyId>
        <KeyId>urn:uuid:0fe2d73a-ebe3-9844-b3de-4517c63c4b90</KeyId>
        <KeyId>urn:uuid:862fa79a-18c7-9245-a172-486541bef0c0</KeyId>
        <KeyId>urn:uuid:aa2f1a88-7a55-894d-bc19-42afca589766</KeyId>
        <KeyId>urn:uuid:59d6eeff-cd56-6245-9f13-951554466626</KeyId>
        <KeyId>urn:uuid:14a13b1a-76ba-764c-97d0-9900f58af53e</KeyId>
        <KeyId>urn:uuid:ccdbe0ae-1c3f-224c-b450-947f43bbd640</KeyId>
        <KeyId>urn:uuid:dcd37f10-b042-8e44-bef0-89bda2174842</KeyId>
        <KeyId>urn:uuid:9dd7103e-7e5a-a840-a15f-f7d7fe699203</KeyId>
      </KeyIdList>
    </RequiredExtensions>
    <NonCriticalExtensions/>
  </AuthenticatedPublic>
  <AuthenticatedPrivate Id="ID_AuthenticatedPrivate"><enc:EncryptedKey xmlns:enc="http://www.w3.org/2001/04/xmlenc#">
<enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
<ds:DigestMethod xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
</enc:EncryptionMethod>
4

3 回答 3

1

听起来XPath可能正适合您——只要您知道结构,它就可以让您查询您的 XML 文档以找到您正在寻找的确切内容。

于 2013-06-13T19:43:00.190 回答
1

该表达式Reel.findtext('Id')仅匹配 的直接子级Reel。如果要查找Idxml 文档中的所有标签,只需使用:

ids = [id.text for id in Reel.findall(".//Id")]

Id这将为您提供所有标记的所有文本节点的列表,这些标记是Reel.


编辑:您更新的示例使用命名空间,在本例KeyId中位于默认命名空间 ( http://www.digicine.com/PROTO-ASDCP-KDM-20040311#) 中,因此要搜索它,您需要将其包含在搜索中:

from xml.etree import ElementTree

doc = ElementTree.parse('test.xml')
nsmap = {'ns': 'http://www.digicine.com/PROTO-ASDCP-KDM-20040311#'}
ids = [id.text for id in doc.findall(".//ns:KeyId", namespaces=nsmap)]
print(ids)
...

xpath 子集ElementTree支持相当有限。如果你想要更完整的支持,你应该改用lxml它,它的xpath 支持更完整。

例如,使用 xpath 搜索所有KeyId标签(忽略命名空间)并直接返回其文本内容:

from lxml import etree
doc = etree.parse('test.xml')
ids = doc.xpath(".//*[local-name()='KeyId']/text()")
print(ids)
...
于 2013-06-13T19:51:13.813 回答
0

这是我需要做的。这适用于找到我需要的任何东西。

for node in tree.getiterator():
...     if 'KeyId' in node.tag:
...             mylist = node.tag
...             print(mylist)
... 
于 2013-06-14T14:37:17.560 回答