Javascript 用XML字符串中的转义序列替换特殊字符的正则表达式
我有一个XML字符串,其中包含一些特殊字符(,&),因此无法使用jQuery$.parseXML进行解析 这是示例XML字符串Javascript 用XML字符串中的转义序列替换特殊字符的正则表达式,javascript,jquery,regex,xml,Javascript,Jquery,Regex,Xml,我有一个XML字符串,其中包含一些特殊字符(,&),因此无法使用jQuery$.parseXML进行解析 这是示例XML字符串 <?xml version="1.0" encoding="UTF-8"?> <BackgroundCheck userId="{Username}" password="{Password}"> <BackgroundSearchPackage action="submit" type="{PackageName}">
<?xml version="1.0" encoding="UTF-8"?>
<BackgroundCheck userId="{Username}" password="{Password}">
<BackgroundSearchPackage action="submit" type="{PackageName}">
<ReferenceId>ab<</ReferenceId>
<UserArea>
<PositionDetail>
<EmploymentState>{StateJob}</EmploymentState>
<ProposedSalary>{AnnualSalary}</ProposedSalary>
</PositionDetail>
</UserArea>
<PersonalData>
<PersonName>
<GivenName>{FirstName}</GivenName>
<MiddleName>{MiddleName}</MiddleName>
<FamilyName>{LastName}</FamilyName>
<Affix>{Generation}</Affix>
</PersonName>
<EmailAddress>{Email}</EmailAddress>
<DemographicDetail>
<GovernmentId countryCode="US" issuingAuthority="SSN">{SSN}</GovernmentId>
<DateOfBirth>{DateOfBirth}</DateOfBirth>
</DemographicDetail>
{Aliases}
{PostalAddress}
</PersonalData>
<Screenings useConfigurationDefaults="no">
{Screenings}
<AdditionalItems type="x:interface">
<Text>{Search&Type}</Text>
</AdditionalItems>
<AdditionalItems type="x:return_xml_results">
<Text>yes</Text>
</AdditionalItems>
<AdditionalItems type="x:embed_credentials">
<Text>true</Text>
</AdditionalItems>
<AdditionalItems type="x:integration_type">
<Text>Sample XML</Text>
</AdditionalItems>
<AdditionalItems type="x:postback_url">
<Text>{CallbackURL}</Text>
</AdditionalItems>
{AdditionalItems}
</Screenings>
{Documentation}
</BackgroundSearchPackage>
</BackgroundCheck>
ab
“文本/html”效果更好-
使用html转换文本内容
var-oParser=new-DOMParser();
函数replaceIllegalXML(t){
var oDOM=oParser.parseFromString(t,“text/html”);
var nok=oDOM.documentElement.nodeName==“parsererror”;
如果(挪威克朗){
log(“无法分析字符串”);
返回;
}
var alltext=oDOM.documentElement.textContent.split(“\n”);
对于(var i=0;i
“文本/html”效果更好-
使用html转换文本内容
var-oParser=new-DOMParser();
函数replaceIllegalXML(t){
var oDOM=oParser.parseFromString(t,“text/html”);
var nok=oDOM.documentElement.nodeName==“parsererror”;
如果(挪威克朗){
log(“无法分析字符串”);
返回;
}
var alltext=oDOM.documentElement.textContent.split(“\n”);
对于(var i=0;i我终于实现了我所需要的。多亏了@mplungjan。正如他所指出的,XML文件必须是有效的才能被解析,并且应该在创建XML的地方使其有效
我的情况有所不同,我必须在解析无效的XML字符串之前,仅用javascript修复它
在用javascript(或任何其他编程语言)解析XML字符串时,我们得到了一个错误,指定了错误的内容和行号。
我所做的就是这样
- 从错误中检索行号
- 从字符串中提取该行并修复它
- 重复此过程,直到修复完整的XML
这就是我所做的
var oParser = new DOMParser();
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function remove_error(str, line) {
var allTexts = str.split("\n");
var illegal = allTexts[line - 1];
var extract = illegal.match(/>(.*)</);
extract = extract.pop();
var fix_extract = extract.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
fix_extract = fix_extract.trim();console.log(fix_extract);
var re = new RegExp(">"+escapeRegExp(extract.trim())+"<");
str = str.replace(re,">"+fix_extract+"<");
return str;
}
var fixed = "", final_fixed = "";
function process(orig_str) {
var newDOM = oParser.parseFromString(orig_str, "text/xml");
var error = newDOM.getElementsByTagName("parsererror");
if (error && error.length) {
if (error[0] && error[0].innerHTML) {
var err_html = error[0].innerHTML;
var parse_err = oParser.parseFromString(err_html, "text/html");
var err_log = parse_err.getElementsByTagName("div")[0].innerHTML;
console.log(err_log);
//var string = err_log.substring(err_log.lastIndexOf("line")+1, err_log.lastIndexOf("at"));
var regex = /line\s*(.*?)\s*at/g;
var matches = [];
while (m = regex.exec(err_log)) {
matches.push(m[1]);
}console.log(matches);
var err_line = matches[0];
fixed = remove_error(orig_str, err_line);
if (fixed) {console.log(fixed);//return;
process(fixed);
}
//console.log(fixed);
//alert('Invalid XML:' + err_log);
} else {
alert('XML could not be parsed');
return;
}
$('.welcome-page section.welcome .inner').html("<h3 class='text-center'>Invalid XML</h3>");
} else {
final_fixed = orig_str;
}
if(final_fixed) {
return final_fixed;
}
}
var newDOM = process(res[0][0]);
if (!newDOM) {
alert('XML could not be parsed');
return;
}
var-oParser=new-DOMParser();
函数escapeRegExp(str){
返回str.replace(/[\-\[\]\/\{\\}(\)\*\+\?\.\\\^\$\\\\\\\\\\;]/g,“\$&”);
}
函数删除_错误(str,行){
var alltext=str.split(“\n”);
var非法=所有文本[第1行];
var extract=invalign.match(/>(.*)我终于实现了我所需要的。多亏了@mplungjan。正如他所指出的,XML文件必须是有效的才能被解析,并且应该在创建XML的地方使其有效
我的情况有所不同,我必须在解析无效的XML字符串之前,仅用javascript修复它
在用javascript(或任何其他编程语言)解析XML字符串时,我们得到了一个错误,指定了错误的内容和行号。
我所做的就是这样
- 从错误中检索行号
- 从字符串中提取该行并修复它
- 重复此过程,直到修复完整的XML
这就是我所做的
var oParser = new DOMParser();
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function remove_error(str, line) {
var allTexts = str.split("\n");
var illegal = allTexts[line - 1];
var extract = illegal.match(/>(.*)</);
extract = extract.pop();
var fix_extract = extract.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
fix_extract = fix_extract.trim();console.log(fix_extract);
var re = new RegExp(">"+escapeRegExp(extract.trim())+"<");
str = str.replace(re,">"+fix_extract+"<");
return str;
}
var fixed = "", final_fixed = "";
function process(orig_str) {
var newDOM = oParser.parseFromString(orig_str, "text/xml");
var error = newDOM.getElementsByTagName("parsererror");
if (error && error.length) {
if (error[0] && error[0].innerHTML) {
var err_html = error[0].innerHTML;
var parse_err = oParser.parseFromString(err_html, "text/html");
var err_log = parse_err.getElementsByTagName("div")[0].innerHTML;
console.log(err_log);
//var string = err_log.substring(err_log.lastIndexOf("line")+1, err_log.lastIndexOf("at"));
var regex = /line\s*(.*?)\s*at/g;
var matches = [];
while (m = regex.exec(err_log)) {
matches.push(m[1]);
}console.log(matches);
var err_line = matches[0];
fixed = remove_error(orig_str, err_line);
if (fixed) {console.log(fixed);//return;
process(fixed);
}
//console.log(fixed);
//alert('Invalid XML:' + err_log);
} else {
alert('XML could not be parsed');
return;
}
$('.welcome-page section.welcome .inner').html("<h3 class='text-center'>Invalid XML</h3>");
} else {
final_fixed = orig_str;
}
if(final_fixed) {
return final_fixed;
}
}
var newDOM = process(res[0][0]);
if (!newDOM) {
alert('XML could not be parsed');
return;
}
var-oParser=new-DOMParser();
函数escapeRegExp(str){
返回str.replace(/[\-\[\]\/\{\\}(\)\*\+\?\.\\\^\$\\\\\\\\\\;]/g,“\$&”);
}
函数删除_错误(str,行){
var alltext=str.split(“\n”);
var非法=所有文本[第1行];
var extract=非法。匹配(/>(.*)欢迎访问SO。请访问@mplungjan。您能指出这个问题的错误吗?请发布努力和代码-您尝试了什么?示例输入和示例输出失败?@mplungjan用我尝试过的内容编辑了我的问题。现在有什么帮助吗?请添加一个XML示例。单击
并创建对SO的欢迎。请访问@mplungjan您能指出这个问题的错误吗?请发布努力和代码-您尝试了什么?示例输入和示例输出失败?@mplungjan用我尝试的内容编辑了我的问题。现在有什么帮助吗?请添加一个XML示例。单击
,并创建一个感谢答案:)。解析为“text/html”会将所有标记转换为小写。例如,BackgroundCheck变为BackgroundCheck。有什么方法可以解决它吗?看看。也许我的解决方案适合您?它不是您真正需要解决问题的地方…PS:您可能需要执行。替换(/&/g),&;amp;)
答案很棒。但是,我的一个XML字符串的节点CR-CRIMINAL恶作剧(<=$200)失败了。我想这是因为该值中有大括号()。或者$有特殊的正则表达式含义,需要转义。答案是:)。解析为“text/html”会将所有标记转换为小写。例如,BackgroundCheck变为BackgroundCheck。有什么方法可以解决它吗?看看。也许我的解决方案适合您?它不是您真正需要解决问题的地方…PS:您可能需要执行。替换(/&/g),&;amp;)
回答得很好。但是,由于我的一个XML字符串包含节点CR-CRIMINAL恶作剧(<=$200),它失败了。我认为这是因为该值中有大括号()。或者$有一个特殊的regex含义,需要转义