如何使用 Groovy 标记生成器向元素添加名称空间和前缀

How to add namespaces and prefixes to elements using Groovy Markup Builder

我正在使用 Mule ESB 将输入 JSON 转换为 XML 以发送到 SOAP 网络服务。我能够构建结构并将名称空间添加到根元素,但我的 SOAP 需要的 XML 输出非常精确,并要求元素中的前缀和名称空间。

这是我的 Groovy 脚本:

def xml = new StringWriter().with { w -> new groovy.xml.MarkupBuilder(w).with {
        SaveContact('http://tempuri.org/') {
            contact() {  
                Address('http://schemas.datacontract.org/2004/07/PivotalService.Entities')   
                {
                    Address1(payload.Address1)
                    Address2(payload.Address2)
                    Address3(payload.Address3)
                    City(payload.City)
                    Country(payload.Country)
                    Fax(payload.Fax)
                    Mobile(payload.Mobile)
                    Phone(payload.Phone)
                    PhoneExtension(payload.PhoneExtension)
                    State(payload.State)
                    Workphone(payload.Workphone)
                    WorkphoneExtension(payload.WorkphoneExtension)
                    Zip(payload.Zip)
                }
                ContactId(payload.ContactId)
                Email(payload.Email)
                Firstname(payload.Firstname)
                Gender(payload.Gender)
                Language(payload.Language)
                Lastname(payload.Lastname)
                PrestashopId(payload.PrestashopId)
            }
            Consent(payload.Consent)
        }
    }
    w.toString()
}

这是它给我的输出示例:

<SaveContact xmlns='http://tempuri.org/'>
  <contact>
    <Address xmlns='http://schemas.datacontract.org/2004/07/PivotalService.Entities'>
      <Address1>2, test street</Address1>
      <Address2>Appartement 10</Address2>
      <Address3 />
      <City>Montreal</City>
      <Country>Canada</Country>
      <Fax />
      <Mobile>+1(418)123-1234</Mobile>
      <Phone>+1(418)123-1234</Phone>
      <PhoneExtension />
      <State>Québec</State>
      <Workphone />
      <WorkphoneExtension />
      <Zip>A1A1A1</Zip>
    </Address>
    <ContactId />
    <Email></Email>
    <Firstname>fooo</Firstname>
    <Gender>1</Gender>
    <Language>3</Language>
    <Lastname>baaarrr</Lastname>
    <PrestashopId>172</PrestashopId>
  </contact>
  <Consent></Consent>
</SaveContact>

如您所见,在添加到元素时,仅命名空间甚至不起作用。

这是我想要的XML(我不确定是否需要前缀(ns0..etc)):

<?xml version="1.0" encoding="ISO-8859-1"?>
<ns0:SaveContact xmlns:ns0="http://tempuri.org/">
  <ns0:contact>
    <ns1:Address xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">
      <ns1:Address1>2, test street</ns1:Address1>
      <ns1:Address2>Appartement 10</ns1:Address2>
      <ns1:City>Montreal</ns1:City>
      <ns1:Country>Canada</ns1:Country>
      <ns1:Mobile>+1(418)123-1234</ns1:Mobile>
      <ns1:Phone>+1(418)123-1234</ns1:Phone>
      <ns1:State>Quebec</ns1:State>
      <ns1:WorkPhone>+1(418)123-1234</ns1:WorkPhone>
      <ns1:Zip>A1A1A1</ns1:Zip>
    </ns1:Address>
    <ns1:Email xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">null</ns1:Email>
    <ns1:Firstname xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">fooo</ns1:Firstname>
    <ns1:Gender xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">1</ns1:Gender>
    <ns1:Language xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">3</ns1:Language>
    <ns1:Lastname xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">baaarrr</ns1:Lastname>
    <ns1:PrestashopId xmlns:ns1="http://schemas.datacontract.org/2004/07/PivotalService.Entities">172</ns1:PrestashopId>
  </ns0:contact>
</ns0:SaveContact>

非常感谢您的帮助。

下面的实现可能有用:

def entityNs = [
    'xmlns:ns1': "http://schemas.datacontract.org/2004/07/PivotalService.Entities"
]

继续上面的内容,并进行如下更改:

....
"ns1:Email"(entityNs, 'foo')
"ns1:Firstname"(entityNs, 'Bar')
....