首页 > 解决方案 > 在 xml 有效负载中使用 javascript 替换所有值

问题描述

我有一个 xml 字符串,我将使用 javascript 替换特定标签的所有值,这是代码:

function replaceDomainName (xmlPayload,domainId)
{
var oldDomain = '<DOMAIN_NAME>OOO';
var oldDomain2 = '<DomainName>OOO';
var newDomain  = '<DOMAIN_NAME>'+domainId ;
var newDomain2  = '<DomainName>'+domainId ;
var xmlString = xmlPayload.toString();
var x  = xmlString.replace(/oldDomain/g,newDomain)
 x = x.replace(/oldDomain2/g,newDomain2)
console.log(x);
return x ; 
}

当我尝试使用以下 XML 调用该函数时,它会引发错误

<TransmissionHeader xmlns:tran="http://xmlns.oracle.com/apps/otm/TransmissionService" xmlns="">
            <Version>20b</Version>
            <TransmissionCreateDt>
                <GLogDate>20200819124057</GLogDate>
                <TZId>UTC</TZId>
                <TZOffset>+00:00</TZOffset>
            </TransmissionCreateDt>
            <TransactionCount>1</TransactionCount>
            <SenderHostName>https://xxx</SenderHostName>
            <SenderSystemID>https:xxx</SenderSystemID>
            <UserName>OOO</UserName>
            <SenderTransmissionNo>404836</SenderTransmissionNo>
            <ReferenceTransmissionNo>0</ReferenceTransmissionNo>
            <GLogXMLElementName>PlannedShipment</GLogXMLElementName>
            <NotifyInfo>
                <ContactGid>
                    <Gid>
                        <DomainName>OOO</DomainName>
                        <Xid>SYS</Xid>
                    </Gid>
                </ContactGid>
                <ExternalSystemGid>
                    <Gid>
                        <DOMAIN_NAME>OOO</DOMAIN_NAME>
                        <Xid>IOT_SYSTEM</Xid>
                    </Gid>
                </ExternalSystemGid>
            </NotifyInfo>
        </TransmissionHeader>

error: unknown: Unexpected token (14:23)

标签: javascriptxml

解决方案


虽然您可以使用 Regex 完成很多工作,但解析 XML 时会变得非常复杂。

请参阅使用 DOMParser 和 XMLSerializer 的示例: https ://jsfiddle.net/o1cenvs3/

const XML = `<TransmissionHeader xmlns:tran="http://xmlns.oracle.com/apps/otm/TransmissionService" xmlns="">
            <Version>20b</Version>
            <TransmissionCreateDt>
                <GLogDate>20200819124057</GLogDate>
                <TZId>UTC</TZId>
                <TZOffset>+00:00</TZOffset>
            </TransmissionCreateDt>
            <TransactionCount>1</TransactionCount>
            <SenderHostName>https://xxx</SenderHostName>
            <SenderSystemID>https:xxx</SenderSystemID>
            <UserName>OOO</UserName>
            <SenderTransmissionNo>404836</SenderTransmissionNo>
            <ReferenceTransmissionNo>0</ReferenceTransmissionNo>
            <GLogXMLElementName>PlannedShipment</GLogXMLElementName>
            <NotifyInfo>
                <ContactGid>
                    <Gid>
                        <DomainName>OOO</DomainName>
                        <Xid>SYS</Xid>
                    </Gid>
                </ContactGid>
                <ExternalSystemGid>
                    <Gid>
                        <DOMAIN_NAME>OOO</DOMAIN_NAME>
                        <Xid>IOT_SYSTEM</Xid>
                    </Gid>
                </ExternalSystemGid>
            </NotifyInfo>
        </TransmissionHeader>`;

if(typeof(String.prototype.trim) === "undefined")
{
    String.prototype.trim = function() 
    {
        return String(this).replace(/^\s+|\s+$/g, '');
    };
}

function replaceDomainName (xmlPayload, oldValue, newValue)
{
  const  parser = new DOMParser();
  const xmlDoc = parser.parseFromString(xmlPayload,"text/xml");
  
  for(let tagName of ['DOMAIN_NAME', 'DomainName']) {
    const instances = xmlDoc.getElementsByTagName(tagName);
    for (let instance of instances) {
        if(instance.innerHTML.trim() == oldValue ) 
        instance.innerHTML = newValue;
    }
  };
  
  const s = new XMLSerializer();
  const d = document;
  const result = s.serializeToString(xmlDoc);
  
  return result;
}
const resultXML = replaceDomainName(XML, 'OOO', 'new.com');
console.log('resultXML', resultXML);

const textarea = document.createElement("textarea");
textarea.innerHTML = resultXML;
textarea.cols = 80;
textarea.rows = 24;
document.body.appendChild(textarea);

推荐阅读