使用 DomParser 解析 XML 后获取令牌文本

Obtain token text after parsing XML with DomParser

提问人:TTBox 提问时间:8/11/2022 更新时间:8/12/2022 访问量:186

问:

我在 NodeJS 中使用 DomParser 时遇到了一些问题。因此,我从 Microsoft API 获得响应,并对其进行解析

const dom = new DomParser().parseFromString(rawData, "text/xml");
console.log(dom);

上面的输出如下所示

<?xml version="1.0" encoding="utf-8"?>
<S:Envelope
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust"
    xmlns:S="http://www.w3.org/2003/05/soap-envelope">
    <S:Header>
        //some header stuff
    </S:Header>
    <S:Body
        xmlns:S="http://www.w3.org/2003/05/soap-envelope">
        <wst:RequestSecurityTokenResponse
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
            xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
            xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust">
            <wst:TokenType>urn:passport:compact</wst:TokenType>
            <wst:RequestedSecurityToken>
                <wsse:BinarySecurityToken Id="Compact0"
                    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">Some Token
                </wsse:BinarySecurityToken>
            </wst:RequestedSecurityToken>
        </wst:RequestSecurityTokenResponse>
    </S:Body>
</S:Envelope>

我已经删除了一些不相关的标签,但我想获得的是其中的令牌,上面是测试一些令牌。所以有了上面的 dom,我做到了BinarySecurityToken

const node = dom.getElementsByTagName("wsse:BinarySecurityToken");
console.log(node);

但这似乎输出了以下内容

[
  Node {
    namespace: 'BinarySecurityToken',
    text: undefined,
    _selfCloseTag: false
  }
]

那么如何使用此 DomParser 获取令牌呢?

谢谢

节点 .js 解析 DOM

评论

0赞 traynor 8/12/2022
使用xml解析器:github.com/NaturalIntelligence/fast-xml-parser/blob/HEAD/docs/...,因为这个解析器没有实现getElementsByTagNameNS

答:

1赞 Jack Fleeting 8/12/2022 #1

首先,返回具有给定标签名称的元素的实时 HTMLCollection;你只需要第一个 - 所以添加. 第二 - 标记是一个文本元素,它是第一个元素的子元素;你也需要考虑到这一点。getElementsByTagName[0]

所以一起:

node = dom.getElementsByTagName("wsse:BinarySecurityToken")[0];
console.log(node.firstChild.nodeValue)

输出:

Some Token