Как читать атрибуты и значения в XML, используя Node Js - PullRequest
0 голосов
/ 29 апреля 2020

Я использовал SOAP API для получения ответа. И теперь у меня длинный XML ответ. Я попытался преобразовать XML в JSON и затем прочитать. Но это не могло работать. Затем я попытался xml2 js, xmldom и filter xml, чтобы прочитать атрибуты. Но это не сработало.

XML Ответ.

<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <eb:MessageHeader xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustUnderstand="1">
            <eb:From>
                <eb:PartyId eb:type="URI" />
            </eb:From>
            <eb:To>
                <eb:PartyId eb:type="URI" />
            </eb:To>
            <eb:CPAId>36465</eb:CPAId>
            <eb:ConversationId>4767547547745757</eb:ConversationId>
            <eb:Service eb:type="sabreXML">Session</eb:Service>
            <eb:Action>SessionCreateRS</eb:Action>
            <eb:MessageData>
                <eb:MessageId>45757457547</eb:MessageId>
                <eb:Timestamp>2020-04-29T12:13:28</eb:Timestamp>
                <eb:RefToMessageId>63465653634ffghfghfghf</eb:RefToMessageId>
            </eb:MessageData>
        </eb:MessageHeader>
        <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
            <wsse:BinarySecurityToken valueType="String" EncodingType="wsse:Base64Binary">bmkfdkdgkdskmlskfsdfpskmfl</wsse:BinarySecurityToken>
        </wsse:Security>
    </soap-env:Header>
    <soap-env:Body>
        <SessionCreateRS xmlns="http://www.opentravel.org/OTA/2002/11" version="1" status="Approved">
            <ConversationId>4767547547745757</ConversationId>
        </SessionCreateRS>
    </soap-env:Body>
</soap-env:Envelope>

** Обновление

Как я уже говорил, я пытался преобразовать XML в JSON, используя xml2jsn. И это дало мне полный ответ json. Но я не могу go для атрибута, который я хочу из-за этих символов, - (da sh) и: (двоеточие).

Я просто хочу получить значение "wsse: BinarySecurityToken". Тогда как можно go для wsse: BinarySecurityToken ??

var parseString = parseStringReq.parseString;

parseString(SetSoapTokenRes, function (err, result) {
    let json_res = JSON.stringify(result, null, 4);
    // json_res = json_res.replace(':', '_') //output: 'A D C'
res.end(json_res.soap-env:Envelope);
});

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

похоже, что вы пытаетесь получить результат неправильно. Вместо json_res.soap-env:Envelope try json_res['soap-env:Envelope'] он может быть экранирован из-за специального символа.

0 голосов
/ 09 мая 2020

В качестве альтернативы, если вы хотите упростить преобразование XML в JSOn только с теми данными, которые вас интересуют, вы можете использовать camaro и сделать это:

const { ready, transform } = require('camaro')

const xml = `
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <eb:MessageHeader xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustUnderstand="1">
            <eb:From>
                <eb:PartyId eb:type="URI" />
            </eb:From>
            <eb:To>
                <eb:PartyId eb:type="URI" />
            </eb:To>
            <eb:CPAId>36465</eb:CPAId>
            <eb:ConversationId>4767547547745757</eb:ConversationId>
            <eb:Service eb:type="sabreXML">Session</eb:Service>
            <eb:Action>SessionCreateRS</eb:Action>
            <eb:MessageData>
                <eb:MessageId>45757457547</eb:MessageId>
                <eb:Timestamp>2020-04-29T12:13:28</eb:Timestamp>
                <eb:RefToMessageId>63465653634ffghfghfghf</eb:RefToMessageId>
            </eb:MessageData>
        </eb:MessageHeader>
        <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
            <wsse:BinarySecurityToken valueType="String" EncodingType="wsse:Base64Binary">bmkfdkdgkdskmlskfsdfpskmfl</wsse:BinarySecurityToken>
        </wsse:Security>
    </soap-env:Header>
    <soap-env:Body>
        <SessionCreateRS xmlns="http://www.opentravel.org/OTA/2002/11" version="1" status="Approved">
            <ConversationId>4767547547745757</ConversationId>
        </SessionCreateRS>
    </soap-env:Body>
</soap-env:Envelope>
`
const template = {
    token: 'soap-env:Envelope/soap-env:Header/wsse:Security/wsse:BinarySecurityToken',
    conversationId: 'soap-env:Envelope/soap-env:Body/SessionCreateRS/ConversationId'
}

;(async function () {
    await ready()
    const result = await transform(xml, template)
    console.log(result)
})()

шаблон только пример. Вы можете добавить больше полей, если хотите. Доступ к token - это просто result.token

пример вывода

{
  token: 'bmkfdkdgkdskmlskfsdfpskmfl',
  conversationId: '4767547547745757'
}
0 голосов
/ 30 апреля 2020

Наконец, я преобразовал XML в JSON, используя пакет xml2 js. И использовал ниже код для чтения атрибутов, как я хочу.

var xml2js = require('xml2js');
var parser = new xml2js.Parser();

parser.parseString(xml_response, function (err, result) {
    if (err) {
        console.error('here is the eror: ', err);
    } else {
        console.log(JSON.stringify(result, null, 2));
        console.log(["soap-env:Envelope"]["soap-env:Header"][0]["token"]); 
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...