如何在C#中遍历XML字符串并对AcctNum标签进行掩码处理
XML中AcctNum标签内容的掩码处理方案
下面提供两种可行的处理方案,分别适用于不同的XML结构复杂度:
方案1:正则表达式快速替换(适合结构简单的XML)
如果你的XML结构固定,没有复杂的标签嵌套或命名空间变化,可以直接用正则匹配<AcctNum>标签内的内容,保留最后4位,其余替换为星号。
示例代码(Python)
import re original_xml = """<Response Version="3" xmlns="http"> <RespClientID> <DID>*************</DID> <ClientRef>********</ClientRef> </RespClientID> <Status StatusCode="OK"></Status> <TransactionResponse> <ReturnCode>000</ReturnCode> <Payload><?xml version="1.0" encoding="utf-8"?><GMF xmlns:xsi="http://www.w3.org/2001/abc" xmlns:xsd="http://www.w3.org/2001/" xmlns="com/"><CreditResponse><CommonGrp><PymtType>Credit</PymtType><TxnType>ABC</TxnType><LocalDateTime>12345</LocalDateTime><TrnmsnDateTime>123</TrnmsnDateTime><STAN>123</STAN><RefNum>123</RefNum><OrderNum>306305490</OrderNum><TermID>00000001</TermID><MerchID>123</MerchID><TxnAmt>298</TxnAmt><TxnCrncy>840</TxnCrncy></CommonGrp><CardGrp><AcctNum>1234543212345411</AcctNum><AVSResultCode>Y</AVSResultCode></CardGrp><VisaGrp><ACI>W</ACI><CardLevelResult>H</CardLevelResult><SourceReasonCode>6</SourceReasonCode><TransID>123</TransID><TaxAmtCapablt>TX</TaxAmtCapablt></VisaGrp><RespGrp><RespCode>000</RespCode><AuthID>OK7898</AuthID><AddtlRespData>APPROVAL</AddtlRespData><AthNtwkID>02</AthNtwkID><AthNtwkNm>VISA</AthNtwkNm></RespGrp></CreditResponse></GMF></Payload> </TransactionResponse> </Response>""" # 匹配16位卡号,保留最后4位替换前面为星号 masked_xml = re.sub(r'<AcctNum>(\d{12})(\d{4})</AcctNum>', r'<AcctNum>************\2</AcctNum>', original_xml) print(masked_xml)
优缺点:代码简洁快速,但如果XML出现标签格式变化(比如标签内有空格、命名空间前缀),正则会失效。
方案2:XML解析库处理(更可靠,支持复杂结构)
如果XML存在嵌套子XML(比如你的Payload里包含另一段GMF格式XML),用专业的XML解析库处理更稳妥,能精准定位到目标标签。
示例代码(Python)
import xml.etree.ElementTree as ET original_xml = """<Response Version="3" xmlns="http"> <RespClientID> <DID>*************</DID> <ClientRef>********</ClientRef> </RespClientID> <Status StatusCode="OK"></Status> <TransactionResponse> <ReturnCode>000</ReturnCode> <Payload><?xml version="1.0" encoding="utf-8"?><GMF xmlns:xsi="http://www.w3.org/2001/abc" xmlns:xsd="http://www.w3.org/2001/" xmlns="com/"><CreditResponse><CommonGrp><PymtType>Credit</PymtType><TxnType>ABC</TxnType><LocalDateTime>12345</LocalDateTime><TrnmsnDateTime>123</TrnmsnDateTime><STAN>123</STAN><RefNum>123</RefNum><OrderNum>306305490</OrderNum><TermID>00000001</TermID><MerchID>123</MerchID><TxnAmt>298</TxnAmt><TxnCrncy>840</TxnCrncy></CommonGrp><CardGrp><AcctNum>1234543212345411</AcctNum><AVSResultCode>Y</AVSResultCode></CardGrp><VisaGrp><ACI>W</ACI><CardLevelResult>H</CardLevelResult><SourceReasonCode>6</SourceReasonCode><TransID>123</TransID><TaxAmtCapablt>TX</TaxAmtCapablt></VisaGrp><RespGrp><RespCode>000</RespCode><AuthID>OK7898</AuthID><AddtlRespData>APPROVAL</AddtlRespData><AthNtwkID>02</AthNtwkID><AthNtwkNm>VISA</AthNtwkNm></RespGrp></CreditResponse></GMF></Payload> </TransactionResponse> </Response>""" # 解析外层XML root = ET.fromstring(original_xml) # 定位到Payload标签 payload = root.find('.//TransactionResponse/Payload') if payload and payload.text: # 解析Payload内的GMF子XML gmf_root = ET.fromstring(payload.text) # 处理命名空间(GMF的默认命名空间是com/) ns_map = {'com': 'com/'} # 找到CardGrp下的AcctNum标签 acct_num_tag = gmf_root.find('.//com:CardGrp/com:AcctNum', ns_map) if acct_num_tag and acct_num_tag.text: # 掩码处理:保留最后4位,前面替换为对应长度的星号 card_num = acct_num_tag.text masked_num = '*' * (len(card_num) - 4) + card_num[-4:] acct_num_tag.text = masked_num # 将修改后的子XML转回字符串,替换回Payload payload.text = ET.tostring(gmf_root, encoding='unicode') # 生成最终的掩码后XML字符串 masked_xml = ET.tostring(root, encoding='unicode') print(masked_xml)
掩码处理后的最终XML
<Response Version="3" xmlns="http"> <RespClientID> <DID>*************</DID> <ClientRef>********</ClientRef> </RespClientID> <Status StatusCode="OK"></Status> <TransactionResponse> <ReturnCode>000</ReturnCode> <Payload><?xml version='1.0' encoding='utf-8'?><GMF xmlns:xsi="http://www.w3.org/2001/abc" xmlns:xsd="http://www.w3.org/2001/" xmlns="com/"><CreditResponse><CommonGrp><PymtType>Credit</PymtType><TxnType>ABC</TxnType><LocalDateTime>12345</LocalDateTime><TrnmsnDateTime>123</TrnmsnDateTime><STAN>123</STAN><RefNum>123</RefNum><OrderNum>306305490</OrderNum><TermID>00000001</TermID><MerchID>123</MerchID><TxnAmt>298</TxnAmt><TxnCrncy>840</TxnCrncy></CommonGrp><CardGrp><AcctNum>************5411</AcctNum><AVSResultCode>Y</AVSResultCode></CardGrp><VisaGrp><ACI>W</ACI><CardLevelResult>H</CardLevelResult><SourceReasonCode>6</SourceReasonCode><TransID>123</TransID><TaxAmtCapablt>TX</TaxAmtCapablt></VisaGrp><RespGrp><RespCode>000</RespCode><AuthID>OK7898</AuthID><AddtlRespData>APPROVAL</AddtlRespData><AthNtwkID>02</AthNtwkID><AthNtwkNm>VISA</AthNtwkNm></RespGrp></CreditResponse></GMF></Payload> </TransactionResponse> </Response>
内容的提问来源于stack exchange,提问作者DT_2
相关产品推荐
相关产品推荐

