用xml2js解析

时间:2017-08-09 15:13:44

标签: node.js xml soap xml2js

我是node.js的新手,需要解析XML。在js中,我只使用DOMParser并使用getElementsByTagName来获取我想要的值。我刚刚切换到节点并使用xml2js(愿意考虑替代方案)。我无法弄清楚如何解析响应以获得我正在寻找的东西。

以下代码:

function parseBody(body){
    var parseString = require('xml2js').parseString;
    var xml = body
    parseString(xml, function (err, result) {
    console.dir(result);
});

这是我传递给函数的XML:

<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:int=\"realURLHere">
   <soapenv:Header/>
   <soapenv:Body>
      <int:readResponse>
         <response>
            <request>?</request>
            <cust>
               <fName>?</fName>
            </cust>
        </response>
      </int:readResponse>
   </soapenv:Body>
</soapenv:Envelope>

这是我的功能的输出:

{ 'soapenv:Envelope':
   { '$':
      { 'xmlns:soapenv': 'http://schemas.xmlsoap.org/soap/envelope/',
        'xmlns:int': 'realURLHere' },
     'soapenv:Body': [ [Object] ] 
   } 
}

我试图在<fName>内访问<cust>的值,但没有运气。任何帮助,将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:1)

var custFName = result['soapenv:Envelope']['soapenv:Body'][0]['int:realURLHe‌​re'][0]['response'][‌​0]['cust'][0]['fName‌​'];

这解决了我的问题。我的挣扎与这个响应有关,所有内容都在数组中。如果有更简单的方法可以做到这一点或更有活力,请告诉我。但就目前而言,这很有效。

答案 1 :(得分:1)

如果将xplicitArray选项设置为false,则在解析时将不会在您不期望的位置创建那些数组。像这样:

Sub ReturnsProduct()
    Dim StartNumber As Single
    Dim i As Integer
    i = Worksheets("Annual Growth").Range("I7")
    Dim cell
    cell = Worksheets("Annual Growth").Range("C12", "C100")
    For cell = 1 To i
    WorksheetFunction.Product (Worksheets("Annual Growth").Range("E12"))
    Next
    Worksheets("Annual Growth").Range("G9").Value = Result
    End Sub

此外,如果删除前缀,它甚至可以变得更加干净:

function parseBody(body) {
    var parseString = require('xml2js').parseString;

    const options = {
        explicitArray: false
    };

    var xml = body
    parseString(xml, options, function (err, result) {
        console.log("cust fname: " + result['soapenv:Envelope']['soapenv:Body']['int:readResponse']['response']['cust']['fName']);
    })
}
var input = '<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:int=\"realURLHere"><soapenv:Header/><soapenv:Body><int:readResponse><response><request>?</request><cust><fName>?</fName></cust></response></int:readResponse></soapenv:Body></soapenv:Envelope>';
parseBody(input);

答案 2 :(得分:0)

试试这个

{
  "fname": "hello world"
}

打印出来

result.fname

您可以使用use Symfony\Component\HttpFoundation\Response; $response = new Response(); $response->headers->set('Content-Type', 'text/json'); $response->send();

进行访问

答案 3 :(得分:0)

如果您使用的是NodeJS,我强烈推荐xml2jsxml2js-xpath。这是他们的示例代码,确实对我有帮助。

var xml2js = require("xml2js");
var xpath = require("xml2js-xpath");
 
xml2js.parseString('<root><element id="15">target</element></root>', function(err, json) {

  // find all elements: returns xml2js JSON of the element
  var matches = xpath.find(json, "//element");
 
  // find the first element, and get its id:
  var matches = xpath.evalFirst(json, "//element", "id");
});