当前位置: 首页 > 知识库问答 >
问题:

Groovy使用名称空间删除部分xml

卫弘义
2023-03-14

我有以下xml。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
  <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
     <u:Timestamp u:Id="_0">
        <u:Created>2015-10-06T15:23:32.787Z</u:Created>
        <u:Expires>2015-10-06T15:28:32.787Z</u:Expires>
     </u:Timestamp>
  </o:Security>
</s:Header>
<s:Body>
  <GetPatientTreatmentTeamResponse xmlns="urn:Custom-com:Common.2014.Services.Patient">
     <GetPatientTreatmentTeamResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <CSN>422332</CSN>
        <PatientIDs>
           <PatientID>
              <ID>23424</ID>
              <IDType>type</IDType>
           </PatientID>
           <PatientID>
              <ID>45335</ID>
              <IDType>typt</IDType>
           </PatientID>
        </PatientIDs>
        <ProviderTeam>
           <ProviderTeam>
              <ProviderID>1212</ProviderID>
              <ProviderIDTypes>
                 <IDandType>
                    <ID>3543</ID>
                    <Type>type</Type>
                 </IDandType>
                 <IDandType>
                    <ID>4535</ID>
                    <Type>type</Type>
                 </IDandType>
                 <IDandType>
                    <ID>5353</ID>
                    <Type>itype</Type>
                 </IDandType>
                 <IDandType>
                    <ID>5353</ID>
                    <Type>type</Type>
                 </IDandType>
              </ProviderIDTypes>
              <ProviderName>name</ProviderName>
              <ProviderRole>roler</ProviderRole>
              <ProviderSpecialty/>
           </ProviderTeam>
</GetPatientTreatmentTeamResult>
</GetPatientTreatmentTeamResponse>
</s:Body>
</s:Envelope>

我想要的是

        <CSN>422332</CSN>
        <PatientIDs>
           <PatientID>
              <ID>23424</ID>
              <IDType>type</IDType>
           </PatientID>
           <PatientID>
              <ID>45335</ID>
              <IDType>typt</IDType>
           </PatientID>
        </PatientIDs>
        <ProviderTeam>
           <ProviderTeam>
              <ProviderID>1212</ProviderID>
              <ProviderIDTypes>
                 <IDandType>
                    <ID>3543</ID>
                    <Type>type</Type>
                 </IDandType>
                 <IDandType>
                    <ID>4535</ID>
                    <Type>type</Type>
                 </IDandType>
                 <IDandType>
                    <ID>5353</ID>
                    <Type>itype</Type>
                 </IDandType>
                 <IDandType>
                    <ID>5353</ID>
                    <Type>type</Type>
                 </IDandType>
              </ProviderIDTypes>
              <ProviderName>name</ProviderName>
              <ProviderRole>roler</ProviderRole>
              <ProviderSpecialty/>
           </ProviderTeam>

我想做的是只使用名称空间xmlns:i=”获取节点GetPatientTreatmentTeamResult下的文本(该节点在不同的调用中会有所不同)http://www.w3.org/2001/XMLSchema-instance(所有调用都有这个)并且不使用实际的节点名。

我尝试过使用XmlParser和XmlSlurper

def s= new XmlSlurper(false, true).parseText(xml).declareNamespace('i':'http://www.w3.org/2001/XMLSchema-instance')

def p= new XmlParser(false, true).parseText(xml)
def ns= new Namespace("http://www.w3.org/2001/XMLSchema-instance", 'instance')

但我一直没能得到我想要的结果。

我该怎么做呢?

共有1个答案

邢寒
2023-03-14

考虑到xml:

def input = '''<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-|wssecurity-utility-1.0.xsd">
              |    <s:Header>
              |        <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
              |            <u:Timestamp u:Id="_0">
              |                <u:Created>2015-10-06T15:23:32.787Z</u:Created>
              |                <u:Expires>2015-10-06T15:28:32.787Z</u:Expires>
              |            </u:Timestamp>
              |        </o:Security>
              |    </s:Header>
              |    <s:Body>
              |        <GetPatientTreatmentTeamResponse xmlns="urn:Custom-com:Common.2014.Services.Patient">
              |            <GetPatientTreatmentTeamResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
              |                <CSN>422332</CSN>
              |                <PatientIDs>
              |                    <PatientID>
              |                        <ID>23424</ID>
              |                        <IDType>type</IDType>
              |                    </PatientID>
              |                    <PatientID>
              |                        <ID>45335</ID>
              |                        <IDType>typt</IDType>
              |                    </PatientID>
              |                </PatientIDs>
              |                <ProviderTeam>
              |                    <ProviderTeam>
              |                        <ProviderID>1212</ProviderID>
              |                        <ProviderIDTypes>
              |                            <IDandType>
              |                                <ID>3543</ID>
              |                                <Type>type</Type>
              |                            </IDandType>
              |                            <IDandType>
              |                                <ID>4535</ID>
              |                                <Type>type</Type>
              |                            </IDandType>
              |                            <IDandType>
              |                                <ID>5353</ID>
              |                                <Type>itype</Type>
              |                            </IDandType>
              |                            <IDandType>
              |                                <ID>5353</ID>
              |                                <Type>type</Type>
              |                            </IDandType>
              |                        </ProviderIDTypes>
              |                        <ProviderName>name</ProviderName>
              |                        <ProviderRole>roler</ProviderRole>
              |                        <ProviderSpecialty/>
              |                    </ProviderTeam>
              |                </ProviderTeam>
              |            </GetPatientTreatmentTeamResult>
              |        </GetPatientTreatmentTeamResponse>
              |    </s:Body>
              |</s:Envelope>'''.stripMargin()

你可以做:

import groovy.xml.*

new XmlParser(false, false).parseText(input)
               .'**'
               .findAll { it instanceof Node }
               .find { it.@'xmlns:i' == 'http://www.w3.org/2001/XMLSchema-instance' }
               .children()
               .each { println XmlUtil.serialize(it) }

其中打印:

<?xml version="1.0" encoding="UTF-8"?><CSN>422332</CSN>

<?xml version="1.0" encoding="UTF-8"?><PatientIDs>
  <PatientID>
    <ID>23424</ID>
    <IDType>type</IDType>
  </PatientID>
  <PatientID>
    <ID>45335</ID>
    <IDType>typt</IDType>
  </PatientID>
</PatientIDs>

<?xml version="1.0" encoding="UTF-8"?><ProviderTeam>
  <ProviderTeam>
    <ProviderID>1212</ProviderID>
    <ProviderIDTypes>
      <IDandType>
        <ID>3543</ID>
        <Type>type</Type>
      </IDandType>
      <IDandType>
        <ID>4535</ID>
        <Type>type</Type>
      </IDandType>
      <IDandType>
        <ID>5353</ID>
        <Type>itype</Type>
      </IDandType>
      <IDandType>
        <ID>5353</ID>
        <Type>type</Type>
      </IDandType>
    </ProviderIDTypes>
    <ProviderName>name</ProviderName>
    <ProviderRole>roler</ProviderRole>
    <ProviderSpecialty/>
  </ProviderTeam>
</ProviderTeam>
 类似资料:
  • 我想从包名称中删除中间部分。例如:com。实例应用程序到com。应用程序 我尝试了一些方法,但无法删除包名称的中间部分,没有出现错误。

  • 问题内容: 我已经导入了WSDL并使用它发送SOAP请求。看起来像这样: 问题出在Calculate元素中。Web服务无法接受。Web服务不喜欢这样的名称空间… 使用SoapUI,我发现此请求可以正常工作: 那么,如何将请求从第一个版本更改为第二个版本?(不使用肮脏的把戏!) (如果会导致正确的请求格式,则重新导入不是问题。) 再说一遍:不允许使用任何肮脏的技巧,例如入侵请求流以对其进行修改! 尽

  • 2)如果我按照下面的方式编辑package-info,那么它是很好的,但是问题是我创建的是一个JAXB整数元素如下所示,前缀删除没有应用于这些元素

  • 问题内容: 我有一个XML文档,我正在尝试使用Etree.lxml进行解析 我的代码是: 当我尝试获取dom.getroot()时,我得到: 但是我只想要: 当我做 我什么也得不到。但是,当我 我得到结果。 我认为将ns_clean = True传递给解析器将防止这种情况。 有任何想法吗? 问题答案: 您可以使用以下方法找到可识别名称空间的节点: 如果您确实要删除名称空间,则可以使用XSL转换:

  • 我正在写一个实用程序之间的集成内部系统和第三方产品。我试图生成一个可以由第三方产品加载的xml文件,但我很难按照他们的要求生成xml。我已经创建了一个简化的版本,只是为了测试。 预期产出应如下: 我的代码如下: 主要: 课程类别:

  • 问题内容: 我喜欢ElementTree解析xml的方式,特别是Xpath功能。我从带有嵌套标签的应用程序以xml输出。 我想按名称访问此标签,而不指定名称空间,这可能吗?例如: 代替: 问题答案: 至少使用lxml2,可以稍微减少此开销: