在使用lxm时在python中用名称空间解析XML时面临的问题

2024-09-29 19:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试访问和修改XML层次结构中的标记。我用了很多方法来达到这个目的。请帮助我访问和修改标签。这是我的XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cre="http://www.code.com/abc/V1/createCase">
   <soapenv:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/2" xmlns:wsu="http://docs.oasis-open.org/a.xsd"></wsse:Security>
   </soapenv:Header>
   <soapenv:Body xmlns:wsu="http://docs.oasis-open.org/30.xsd" wsu:Id="id-14">
      <cre:createCase>
         <cre:Request>
            <cre:ServiceAttributesGrp>
               <cre:MinorVer>?</cre:MinorVer>
            </cre:ServiceAttributesGrp>
            <cre:CreateCaseReqGrp>
               <cre:Language>English</cre:Language>
               <cre:CustFirstNm>Issue</cre:CustFirstNm>
               <cre:CustLastNm>Detection</cre:CustLastNm>
               <cre:AddlDynInfoGrp>
                  <cre:AddlDynInfo>
                           <cre:FieldNm>TM3</cre:FieldNm>
                           <cre:FieldVal></cre:FieldVal>
                  </cre:AddlDynInfo>
                  <cre:AddlDynInfo>
                           <cre:FieldNm>PM417</cre:FieldNm>
                           <cre:FieldVal>Not Defined</cre:FieldVal>
                  </cre:AddlDynInfo>
               </cre:AddlDynInfoGrp>
               <cre:CreateCriteriasGrp>
                  <cre:CreateCriterias>
                     <cre:CriteriaNm>CriticalReqDtlValidationReqd</cre:CriteriaNm>
                  </cre:CreateCriterias>
               </cre:CreateCriteriasGrp>
            </cre:CreateCaseReqGrp>
         </cre:Request>
      </cre:createCase>
   </soapenv:Body>
</soapenv:Envelope>

我必须访问并修改“AddlDynInfo”标记中“FieldVal”标记的值,其中“FieldNm”标记值对应的值是“PM417”(因为“AddlDynInfo”标记有两种情况)。 到目前为止,我只停留在父标签上,因为我无法访问它:

tree = etree.parse(template_xml)
root = tree.getroot()
for msgBody in root[1]:
  for createCase in msgBody:
    for request in createCase:
     print request
     for CreateCaseReqGrp in request.findall('{cre}CreateCaseReqGrp',namespaces=root.nsmap):
     print CreateCaseReqGrp

Tags: in标记orghttpdocsforxmlnswsse
1条回答
网友
1楼 · 发布于 2024-09-29 19:31:54

定义的namespaces and XPaths使这非常容易。你的案子应该是这样的:

ns = {
    'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/',
    'cre': 'http://www.code.com/abc/V1/createCase'
}

for casereq in root.xpath(
    'soapenv:Body/cre:createCase/cre:Request/'
    'cre:CreateCaseReqGrp/cre:AddlDynInfoGrp/cre:AddlDynInfo', namespaces=ns):
    print casereq.xpath('cre:FieldNm/text()', namespaces=ns)
    print casereq.xpath('cre:FieldVal/text()', namespaces=ns)

相关问题 更多 >

    热门问题