XML解析em nodejs com xmlbuilder2
#javascript #typescript #node #soap
好吧,正如在伪装的帖子中所说的那样,我有一个时刻我认为我无法访问网络服务的定义。这样,我的生活就会更加复杂。这并不是世界的尽头,但是我必须进行XML解析,这是相对无聊的。

很好。那是我知道XMLBuilder库的时候。更确切地说,该lib的V2(它们处于不同的回归中)。

GitHub logo oozcitak / xmlbuilder2

XML构建器for Node.js

xmlbuilder2

An XML builder for node.js.

License NPM Version NPM Downloads jsDelivr

Node.js CI Code Coverage Dev Dependency Status

安装:

 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获得图书馆的“质量”。

我在报价之间提出了质量,因为这不是真正定义其质量的原因,而是给我一些我认为重要的东西,因为发现了安全漏洞,每周的新下载量以及频繁的支持对于仆人。

Package Health Score 16abr2023

好...笔记是100中的79。这不是最好的,但它是一年来的。影响音符的一件事是上次版本的时间。但是我花了一件事决定最终使用它:XML并不是上次遭受重大变化的技术。而且,如果自由没有安全性问题,那么最近不改变它是没有意义的。

UTILIZAã§o

很好。不再包裹。为了演示如何使用库,我创建了一个非常简单的nodejs项目,您会在此处找到该库...

GitHub logo marcopollivier / practice.node-with-xml

POC项目如何用nodejs以较不昂贵的方式操纵XML

practice.node-with-xml




安装它是基本的

$ 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>
但是,当我们在JSON中代表这一点时,它只是突出了第二个元素。

为了解决这个问题,我尝试应用该元素,但是它也很好地工作了original.root().ele('soap:Body').ele('aaa')

包括£o

也许它到达了本文的结尾有些令人沮丧,但是重要的是要表明,它会以我们在服务之间的整合方式产生很多差异。而且,当您选择制作SOAP Webrservice时,您将创建许多可能不是必需的复杂性。特别是认为您使用相同协议具有其他形式的集成,并且它将产生更少的工作。

至于图书馆,这很有趣,但是我们会遇到问题,我们需要大步散步来尝试解决,并且根据问题,我们会遇到一些局限性。就像元素的备用一样。

坦率地说,我什至不认为要解决这个问题是值得的,因为与此同时,我发现我可以访问此WS的WSDL。在本文中,这是自由行可以为您提供帮助的程度,并取决于情况。如果您想从这里前进并在评论中发布如何离开本轮解决方案,我感谢您,当我调整文本时,我一定会给您适当的作物。 :)

如果您没有选择,并且必须与SOAP Web服务集成,则如果以任何方式可用WSDL,则花束。这样,您的生活将变得更简单(正如我们将在下一篇文章中看到的那样)。

值得结束的经验,并有同样的问题:根据我自己的经验,我们在肥皂parseando XML中也进行了整合。我们所遇到的是WS供应商方面的合同。我们无法确定已经进行了变化,整合失败会造成大量的财务损失。所以这里有两个文学。谨慎对整合的合同,并了解其服务的最新性。