创建自己的xml命名空间

56lgkhnf  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(507)

我已经按照教程https://spring.io/guides/gs/producing-web-service/ 用于创建将接收soap请求并应返回一些soap响应的应用程序。但是,教程中的名称空间只是一个示例。如何创建自己的命名空间(uri、前缀、内容?我一直在寻找,但没有成功…提前谢谢!

yjghlzjz

yjghlzjz1#

正如我在上面的评论中提到的,您应该阅读这篇文章来理解xml名称空间是什么:xml名称空间是用来做什么的?。
在您的问题上下文中,它的要点是它提供了一些关于xml中元素的上下文。例如,如果您的服务遇到 <table> 元素,服务器如何知道 <table> 这是?
是这个吗?

是这个吗?

还是这个?

名称空间允许您通过添加名称空间来区分它们:

<table xmlns="urn:tabular-data:tables">
<table xmlns="urn:chemistry:periodic-table">
<table xmlns="urn:products:furniture:kitchen-table">

你可能也想看看这个问题,看看我在这里做了什么,但简而言之,我只是编出来的。我当场发明的。
在你的例子中,你也可以这样做。
关键是soap消息是由不同元素组成的xml。有些属于soap本身,有些属于您的应用程序,有些属于其他web服务规范,等等,您的服务需要理解它们。这就是为什么要使用名称空间,以便为元素添加意义。例如,在该页面上有以下请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:gs="http://spring.io/guides/gs-producing-web-service">
   <soapenv:Header/>
   <soapenv:Body>
      <gs:getCountryRequest>
         <gs:name>Spain</gs:name>
      </gs:getCountryRequest>
   </soapenv:Body>
</soapenv:Envelope>

当你说它是一个信封,你不是指任何信封,你是指一个肥皂信封。你知道它是一个soap信封,因为它的名称空间是 http://schemas.xmlsoap.org/soap/envelope/ . soap负载本身具有来自名称空间的元素 http://spring.io/guides/gs-producing-web-service .
两者都是发明出来的,唯一的区别是 http://schemas.xmlsoap.org/soap/envelope/ 它被发明后,在一份文件中被标准化,这样每个人都知道它的含义。你不需要把你的标准化( http://spring.io/guides/gs-producing-web-service 也不是),你只需要创造一个独特的和特定于你的环境。
人们通常使用自己的域名空间,甚至可能在其中添加一些时间戳。所以你可以用 http://jovana-vajagic.com/2021/03/20/example-service 如果你认为那是你独有的。或者你可以用 urn:uuid:8f4ac50e-574b-4936-b49b-8b129bea945b 如果你想的话(我从这里得到了随机的uuid)。
所以基本上,你只需要发明一个非常独特的代码,然后在下面这个例子的代码中替换它。
至于在该名称空间中定义元素,您将需要一个xml模式,在该模式中定义元素、子元素、属性及其类型等。查看下面的教程,您将看到关于xml模式的一节:

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:tns="http://spring.io/guides/gs-producing-web-service"
  targetNamespace="http://spring.io/guides/gs-producing-web-service" 
  elementFormDefault="qualified">
    ...

您需要使用名称空间(比如 http://jovana-vajagic.com/2021/03/20/example-service 或者你选择的任何东西)并在那里声明你的元素。
你将有一些阅读做:)祝你好运!

相关问题