很好。那是我知道XMLBuilder库的时候。更确切地说,该lib的V2(它们处于不同的回归中)。
oozcitak / xmlbuilder2
XML构建器for Node.js
xmlbuilder2
An XML builder for node.js.
安装:
npm安装xmlbuilder2
文档:
请参阅:https://oozcitak.github.io/xmlbuilder2/
用法:
xmlbuilder2
是围绕DOM节点的包装器,它添加了可链功能,以使创建和使用XML文档更容易。例如,以下XML文档:
<? xml 版本 = “ 1.0 “ ?>?>
<< span class =“ pl-ent”> root att = ” val “ >
<< span class =“ pl-ent”> foo >
<< span class =“ pl-ent”> bar > foobar bar >
foo >
<< span class =“ pl-ent”> baz />
root >
可以使用以下功能链创建:
费用x图书馆福利
我在宇宙JS/TS中没有那么多年。我最大的背景来自Java,Go and Clojure。这样,我总是会使用aã找到的任何库。我呼吁snyk.io获得图书馆的“质量”。
我在报价之间提出了质量,因为这不是真正定义其质量的原因,而是给我一些我认为重要的东西,因为发现了安全漏洞,每周的新下载量以及频繁的支持对于仆人。
好...笔记是100中的79。这不是最好的,但它是一年来的。影响音符的一件事是上次版本的时间。但是我花了一件事决定最终使用它:XML并不是上次遭受重大变化的技术。而且,如果自由没有安全性问题,那么最近不改变它是没有意义的。
UTILIZAã§o
很好。不再包裹。为了演示如何使用库,我创建了一个非常简单的nodejs项目,您会在此处找到该库...
安装它是基本的
$ npm install xmlbuilder2
作为基础,我们将从基本XML开始。如果我们没有WSDL,我们将要做的是使用每个帖子并在有效负载中传递XML的HTTP请求,在这里,我们将喜欢如何创建XML来发送此有效负载。其他一切都会打扰我们的目标。
最初将基于以下XML(我将尝试使SOAP WebService的XML最大可能):
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://wms2.marcopollivier.dev/soap/webservice.xpto"
xmlns:types="http://wms2.marcopollivier.dev/soap/webservice.xpto/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<!-- Cadastra Livros - Requisição -->
<tns:CadastraLivros id="id1" xsi:type="tns:CadastraLivros">
<LivrosArray href="#id2"/>
</tns:CadastraLivros>
<!-- Livros - Array -->
<soapenc:Array id="id2" soapenc:arrayType="tns:Livro[1]">
<Item href="#id3"/>
</soapenc:Array>
<!-- Livros - Array -->
<tns:Livro id="id3" xsi:type="tns:Livro">
<Pedido xsi:type="xsd:string">O Conde de Monte Cristo</Pedido>
<ExemplaresArray href="#id4"/>
</tns:Livro>
<!-- Exemplares - Array -->
<soapenc:Array id="id4" soapenc:arrayType="tns:Exemplar[1]">
<Item href="#id5"/>
</soapenc:Array>
<!-- Exemplar -->
<tns:Exemplar id="id5" xsi:type="tns:Exemplar">
<Quantidade xsi:type="xsd:nonNegativeInteger">5</Quantidade>
<AnoEdicao xsi:type="xsd:string">2022</Pedido>
</tns:Exemplar>
</soap:Body>
</soap:Envelope>
我知道XML有点大,但是我想代表一些我认为在这里很重要的XML重要性的特殊性
第一次尝试:标准解决方案
很好。图书馆提供的第一个示例是以您在XML层次结构中航行的方式进行。
由于该布下的该库使用Xpath的层来浏览标签,因此该策略为一半,也许是第一个呈现的。坦率地说,我要做第一个标签,因为这也是最言语的方式...
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://wms2.marcopollivier.dev/soap/webservice.xpto"
xmlns:types="http://wms2.marcopollivier.dev/soap/webservice.xpto/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
也许最无聊的部分是这个开始。我必须在koud1
元素中定义一些属性
create({ version: '1.0' })
.ele('soap:Envelope', { 'xmlns:soap': 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:soapenc': 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:tns': 'http://wms2.marcopollivier.dev/soap/webservice.xpto',
'xmlns:types': 'http://wms2.marcopollivier.dev/soap/webservice.xpto/encodedTypes',
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema',
})
.up();
仅仅代表soap:envelop
的第一部分似乎已经是一种非常说的方式。这可以通过代码的延续来确认。
如果您注意到了,最终有一个up()
的呼叫。还记得我说过这个lib在布下使用Xpath的层吗?这很清楚。已经没有,如果我不想继续雏鸟元素,我不得不说,我想在创作下一部小说之前攀登一部小说。即:
el('a').el('b').el('c')
将生成类似的东西:
<a>
<b>
<c>
</c>
</b>
</a>
这样,如果您搬到Koud5,您将拥有类似的东西:
<a>
<b></b>
<c></c>
</a>
入口,以这种方式表示我们的下一个示例(soap:body
)只是做类似的事情:
create({ version: '1.0' })
.ele('soap:Envelope', { 'xmlns:soap': 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:soapenc': 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:tns': 'http://wms2.marcopollivier.dev/soap/webservice.xpto',
'xmlns:types': 'http://wms2.marcopollivier.dev/soap/webservice.xpto/encodedTypes',
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema',
})
.ele('soap:Body', { 'id': '#1', 'soapenc:arrayType': "tns:Livro[1]" })
.up();
现在重复其余的...
第二次尝试:使用对象JSON
是。 LIB提供此选项。而且我没有第一次介绍她,因为我想加强有一种可以具有其优势的方式。
对于非常大的XML(这是我们的情况),以前的模型可以证明是动词和重复性的,但是无论是否想要,您将拥有比您的控制权更多。对于更简单的XML,我认为它可以使用此选项。
但是,您不会否认有可能通过JSON创建XML的吸引力。只是我脑海中的一件事:XML具有属性,正如我们所看到的,在XMLS肥皂中非常普遍。
但是是的...这要简单得多。如此之多,以至于我兴奋和做得比上一个示例更多。
const obj = {
'soap:Envelope': {
'@xmlns:soap': "http://schemas.xmlsoap.org/soap/envelope/",
'@xmlns:soapenc': "http://schemas.xmlsoap.org/soap/encoding/",
'@xmlns:tns': "http://wms2.marcopollivier.dev/soap/webservice.xpto",
'@xmlns:types': "http://wms2.marcopollivier.dev/soap/webservice.xpto/encodedTypes",
'@xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
'@xmlns:xsd': "http://www.w3.org/2001/XMLSchema",
'soap:Body': {
'@soap:encodingStyle': 'http://schemas.xmlsoap.org/soap/encoding/',
'tns:CadastraLivros': {
'@id': 'id1',
'@xsi:type': 'tns:CadastraLivros',
'LivrosArray': {
'@href': '#id2'
}
}
}
}
};
很好。一切进展顺利,我们遇到以下问题:XML具有可以区分同名元素的属性,我们的XML可以在同一元素中重复元素。元素是什么情况
<soapenc:Array id="id2" soapenc:arrayType="tns:Livro[1]">
<Item href="#id3"/>
</soapenc:Array>
<soapenc:Array id="id4" soapenc:arrayType="tns:Exemplar[1]">
<Item href="#id5"/>
</soapenc:Array>
为了解决这个问题,我尝试应用该元素,但是它也很好地工作了original.root().ele('soap:Body').ele('aaa')
包括£o
也许它到达了本文的结尾有些令人沮丧,但是重要的是要表明,它会以我们在服务之间的整合方式产生很多差异。而且,当您选择制作SOAP Webrservice时,您将创建许多可能不是必需的复杂性。特别是认为您使用相同协议具有其他形式的集成,并且它将产生更少的工作。
至于图书馆,这很有趣,但是我们会遇到问题,我们需要大步散步来尝试解决,并且根据问题,我们会遇到一些局限性。就像元素的备用一样。
坦率地说,我什至不认为要解决这个问题是值得的,因为与此同时,我发现我可以访问此WS的WSDL。在本文中,这是自由行可以为您提供帮助的程度,并取决于情况。如果您想从这里前进并在评论中发布如何离开本轮解决方案,我感谢您,当我调整文本时,我一定会给您适当的作物。 :)
如果您没有选择,并且必须与SOAP Web服务集成,则如果以任何方式可用WSDL,则花束。这样,您的生活将变得更简单(正如我们将在下一篇文章中看到的那样)。值得结束的经验,并有同样的问题:根据我自己的经验,我们在肥皂parseando XML中也进行了整合。我们所遇到的是WS供应商方面的合同。我们无法确定已经进行了变化,整合失败会造成大量的财务损失。所以这里有两个文学。谨慎对整合的合同,并了解其服务的最新性。