我正在编写 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 构建的。
您正在尝试读取 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);
});