我有XML数据的字符串。 我需要在节点内逃脱的价值观,而不是节点本身。
例如:
<node1>R&R</node1>
应该逃避:
<node1>R&R</node1>
不应逃避:
<node1>R&R</node1>
我一直在这最后几天,但没有太多的成功。 我不与Java的专家,但我已经尝试了以下的东西是行不通的:
- 解析字符串XML到文档中。 不工作,因为在节点内的数据包含无效的XML数据。
- 所有转义字符。 因为程序接收到该数据以这种格式将不接受这是行不通的。
- 转义的所有字符,然后解析成文档。 抛出各种错误。
任何帮助将非常感激。
你可以通过/过程中使用正则表达式匹配找到所有尖括号中的字符串,每次循环的那些。 在这个例子中,我使用了Apache的百科全书郎做XML转义。
public String sanitiseXml(String xml)
{
// Match the pattern <something>text</something>
Pattern xmlCleanerPattern = Pattern.compile("(<[^/<>]*>)([^<>]*)(</[^<>]*>)");
StringBuilder xmlStringBuilder = new StringBuilder();
Matcher matcher = xmlCleanerPattern.matcher(xml);
int lastEnd = 0;
while (matcher.find())
{
// Include any non-matching text between this result and the previous result
if (matcher.start() > lastEnd) {
xmlStringBuilder.append(xml.substring(lastEnd, matcher.start()));
}
lastEnd = matcher.end();
// Sanitise the characters inside the tags and append the sanitised version
String cleanText = StringEscapeUtils.escapeXml10(matcher.group(2));
xmlStringBuilder.append(matcher.group(1)).append(cleanText).append(matcher.group(3));
}
// Include any leftover text after the last result
xmlStringBuilder.append(xml.substring(lastEnd));
return xmlStringBuilder.toString();
}
这看起来对<东西>文本的比赛</某事>,捕获标签名称和包含的文本,sanitises包含的文本,然后把它重新走到一起。
的问题是, <node1>R&R</node1>
不是XML。
但我认为最好的解决办法是让正确的XML摆在首位:
What you've presented isn't XML. It's XPL. XPL is structured just like XML but allows XML's "special characters" in text fields. You can easily do the XPL to XML conversions with the XPL utilities. http://hll.nu
我用无名之声的答案,但有一个正则表达式:
Pattern xmlCleanerPattern = Pattern.compile("(<[^<>]*>)(.*)(<\\/[^<>]*>)")
我觉得这是捕获节点本身好一点内的所有值