如何读取 XML,然后将其编码为 Base64,并使用填充避免奇怪的字符

问题描述 投票:0回答:1

我正在编写 TypeScript 代码,我想读取 XML 文件,然后使用填充将其编码为 Base64。我可以读取并编码该文件,但解码后,我看到许多我不想要的奇怪字符。

我的 XML 文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DataContent xmlns="http://esw.vlv.com/somecontent" xmlns:ns6="http://esw.vlv.com/somecontent" xmlns:ns5="http://esw.vlv.com/somecontent" xmlns:ns8="http://esw.vlv.com/somecontent" xmlns:ns7="http://esw.vlv.com/somecontent" xmlns:ns9="http://esw.vlv.com/somecontent" xmlns:ns11="http://somecontent.com/somecontent/1_1" xmlns:ns10="http://vcg.somecontent.com/somecontent" xmlns:ns4="http://esw.vlv.com/somecontent" schemaVersion="2.7">
    <Status>
        <DataCompleted/>
    </Status>
    <Messages>
        <Message>
            <ReasonCode>33</ReasonCode>
            <ReasonDesc>Info:</ReasonDesc>
            <ReasonDesc>Val = 2</ReasonDesc>
            <ReasonDesc>BLE = 1234567890</ReasonDesc>
            <ReasonDesc>BLA = SOMETHING 12345</ReasonDesc>
        </Message>
    </Messages>
    <DataContentOutputs>
        <DataContentOutput>
            <Inputs>
                <Input>
                    <InputVal schemaVersion="2.1" InputCode="BLAP2">
                        <ns5:Val>
                            <ns4:Bool>true</ns4:Bool>
                        </ns5:Val>
                    </InputVal>
                </Input>
            </Inputs>
            <FailedInputs/>
        </DataContentOutput>
    </DataContentOutputs>
</DataContent> 

我使用下面的代码将文件作为字符串读取,格式化 XML:

const stringFileContent= fs.readFileSync(filePathGoesHere, 'utf-8')
const xmlFileContent = xmlFormat(stringFileContent, {
            indentation: '  ', 
            collapseContent: true, 
            lineSeparator: '\r\n'
        })

调试代码时,这是我在

xmlFileContent
变量中获得的值:

'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n <DataContent xmlns="http://esw.vlv.com/somecontent" xmlns:ns6="http://esw.vlv.com/somecontent" xmlns:ns5="http://esw.vlv.com/somecontent" xmlns:ns8="http://esw.vlv.com/somecontent" xmlns:ns7="http://esw.vlv.com/somecontent" xmlns:ns9="http://esw.vlv.com/somecontent" xmlns:ns11="http://somecontent.com/somecontent/1_1" xmlns:ns10="http://vcg.somecontent.com/somecontent" xmlns:ns4="http://esw.vlv.com/somecontent" schemaVersion="2.7">\r\n  <Status>\r\n    <DataCompleted/>\r\n  </Status>\r\n  <Messages>\r\n  …Desc>BLE = 1234567890</ReasonDesc>\r\n      <ReasonDesc>BLA = SOMETHING 12345</ReasonDesc>\r\n    </Message>\r\n  </Messages>\r\n  <DataContentOutputs>\r\n    <DataContentOutput>\r\n      <Inputs>\r\n        <Input>\r\n          <InputVal schemaVersion="2.1" InputCode="BLAP2">\r\n            <ns5:Val>\r\n              <ns4:Bool>false</ns4:Bool>\r\n            </ns5:Val>\r\n          </InputVal>\r\n        </Input>\r\n      </Inputs>\r\n      <FailedInputs/>\r\n    </DataContentOutput>\r\n  </DataContentOutputs>\r\n</DataContent>'

然后我使用下面的代码将上述 XML 编码为 Base64 并进行填充:

const xmlEncoded = this.xmlEncodeBase64WithPadding(xmlFileContent)

   private xmlEncodeBase64WithPadding(content: any){
        const encodedBytes = Buffer.from(content, 'utf-8').toString('base64');
        let encodedStr = encodedBytes;

        // Add padding if necessary
        const paddingNeeded = encodedStr.length % 4;
        if (paddingNeeded) {
            encodedStr += '='.repeat(4 - paddingNeeded);
        }

        return encodedStr;
    } 
        

问题是,当我获得编码结果并使用 Notepad++ 对其进行解码时,我可以看到像这样的奇怪字符,我看到这些字符是由二进制文件引起的,但我无法解决,我想避免它们:

熖煆V%Ǘ5&W7VLJ3У´FF6ö熖煦W÷'C

这是完整的编码结果: PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KPERhdGFDb250ZW50IHhtbG5zPSJodHRwOi8vZXN3LnZsdi5j b20vc29tZWNvbnRlbnQiIHhtbG5zOm5zNj0iaHR0cDovL2Vzdy52bHYuY29tL3NvbWVjb250ZW50IiB4bWxuczpuczU9Imh0dHA6Ly9lc3cudmx2LmNvbS9zb21lY 29udGVudCIgeG1sbnM6bnM4PSJodHRwOi8vZXN3LnZsdi5jb20vc29tZWNvbnRlbnQiIHhtbG5zOm5zNz0iaHR0cDovL2Vzdy52bHYuY29tL3NvbWVjb250ZW50Ii B4bWxuczpuczk9Imh0dHA6Ly9lc3cudmx2LmNvbS9zb21lY29udGVudCIgeG1sbnM6bnMxMT0iaHR0cDovL3NvbWVjb250ZW50LmNvbS9zb21lY29udGVudC8xXzE …AgICAgICAgICAgIDxJbnB1dFZhbCBzY2hlbWFWZXJzaW9uPSIyLjEiIElucHV0Q29kZT0iQkxBUDIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG5zNTpWYW w+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5zNDpCb29sPmZhbHNlPC9uczQ6Qm9vbD4NCiagICAgICAgICAgICAgICAgICAgICAgIDwvbnM1OLZhbD4 NciAgICAgICAgICAgICAgICAgICAgPC9JbnB1dFZhbD4NCiagICAgICAgICAgICAgICA8L0lucHV0Pg0KICAgICAgICAgICAgPC9JbnB1dHM+DQogICAgICAgICAg ICA8RmFpbGVkSW5wdXRzLz4NCiAgICAgICAgPC9EYXRhQ29udGVudE91dHB1dD4NCiagICA8L0RhdGFDb250ZW50T3V0cHV0cz4NCjwvRGF0YUNvbnRlbnQ+IA==

这是在Notepad++中解码后的xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DataContent xmlns="http://esw.vlv.com/somecontent" xmlns:ns6="http://esw.vlv.com/somecontent" xmlns:ns5="http://esw.vlv.com/somecontent" xmlns:ns8="http://esw.vlv.com/somecontent" xmlns:ns7="http://esw.vlv.com/somecontent" xmlns:ns9="http://esw.vlv.com/somecontent" xmlns:ns11="http://somecontent.com/somecontent/1_1¦Ė燗Ef66V֕fW'6ö㒣"㒢燗D6öFSҤ$ĕ"#ТƧ3S¥fàТƧ3C¤&ööæfǶS¶糃¤&ööàТ¶糓¥fàТ´燗EfàТ´燗CТ´燗G3ТĦƖD燗G2󠐢´FF6ö熖焷WGWCТ´FF6ö熖焷WGWG3У´FF6ö熖烢 

非常重要 我怀疑这与某些配置有关。 因为我可以使用另一个存储库使其工作。 但是,我仍然需要在存储库上运行此代码,但它不会生成正确的编码值。 您知道是否有任何配置或软件包版本可能导致此问题?

我的项目是用 PlayWright + TypeScript + Cucumber 构建的。

typescript xml base64 cucumber playwright
1个回答
0
投票

您正在尝试读取 xmlString 格式的 XML 文件。请使用以下代码:

function readXMLFile(filePath: string): Promise<string> {
    return new Promise((resolve, reject) => {
        fs.readFile(filePath, 'utf-8', (err, data) => {
            if (err) {
                reject('Error reading XML file: ' + err);
            } else {
                resolve(data);
            }
        });
    });
}

您完整的代码应该是:

const filePath = './data/sampledata.xml';
readXMLFile(filePath)
    .then((xmlString) => {
        // console.log(xmlString);
        try {
            // Use Your function for XML String encoding
            // console.log(xmlEncodeBase64WithPadding(xmlString));

            // Alternative way
            const base64String = btoa(unescape(encodeURIComponent(xmlString)));
            const paddedBase64 = base64String.padEnd(Math.ceil(base64String.length / 4) * 4, '=');
            console.log(paddedBase64);
        } catch (error) {
            console.error('Error encoding XML to Base64:', error);
        }
    })
    .catch((error) => {
        console.error(error);
    });
© www.soinside.com 2019 - 2024. All rights reserved.