鉴于String类型中的xml结构,我正在寻找一种用四个星号替换数据的方法,同时将标记留在原位。也就是说,从这个
开始<one> <two> abc </two> <two> def </two> </one>
我希望它成为
<one> <two> **** </two> <two> **** </two> </one>
我试过
requestBody.replaceAll(">[^<]+?<","> **** <")
但我也在捕捉两个相邻标签之间的空白区域,因此
<one> **** <two> **** </two> **** <two> **** </two> **** </one>
我怎样才能实现目标?有什么建议?
某些测试Here。
根据Michael Kay的建议,我找到了这个解决方案
/**
* Anonimyzes an xml structure replacing all data between tags with 4 asterisks.
* Tags won't be replaced.
*
* @param xmlInput the string representing the xml to be anonymized
* @return the anonymized xml structure.
*/
private String anonymizeXml(String xmlInput){
String anonimizedXml=null;
try {
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new StringReader("<xsl:transform version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"*\"> <xsl:copy> <xsl:apply-templates/> </xsl:copy></xsl:template><xsl:template match=\"text()[normalize-space()]\"> **** </xsl:template></xsl:transform>"));
Transformer transformer;
transformer = factory.newTransformer(xslt);
Source text = new StreamSource(new StringReader(xmlInput));
StringWriter writer = new StringWriter();
transformer.transform(text, new StreamResult(writer));
anonimizedXml = writer.toString();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return anonimizedXml;
}
答案 0 :(得分:4)
这是一个非常简单的XSLT转换的工作:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[normalize-space()]">****</xsl:template>
</xsl:transform>
答案 1 :(得分:0)
对于单个RegExp,此任务有点过重。您可以使用一个RegExp查找包含标签的地方:
Pattern pattern = Pattern.compile("<[a-z]>[^<]+?</[a-z]>");
Matcher matcher = pattern.matcher(xmlString);
while(matcher.find()) {
System.out.println(xmlString.substring(matcher.start(), matcher.end());
}
会打印:
<two> abc </two>
<two> def </two>
保存每个匹配的位置后,您可以使用原始的RegExp在子字符串中查找要替换的位置。第一个匹配的起始位置添加到子字符串匹配的位置将为您提供在xmlString中替换的位置。
当你拥有所有职位时,你可以开始替换xmlString using substring的部分内容。确保首先替换最后一个匹配,因为每次更换之前的部件时,后面部件的位置都会改变。