给定一个String类型的xml结构,我正在寻找一种方法,用四个星号替换数据,同时将标记留在原位。也就是说,从这个匿名xml:如何在Java中留下标签的同时删除数据?
<one> <two> abc </two> <two> def </two> </one>
我想在开始它成为
<one> <two> **** </two> <two> **** </two> </one>
我已经试过
requestBody.replaceAll(">[^<]+?<","> **** <")
,但我也捕捉两个相邻的标签之间的空白,因此有
<one> **** <two> **** </two> **** <two> **** </two> **** </one>
H我能实现自己的目标吗?有什么建议么?
Here对于一些测试。
编辑
继迈克尔·凯建议我发现这个解决方案
/**
* 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;
}
你不可解析XML或其它任何类似树的语法使用正则表达式。换句话说,这个工作是错误的工具。使用XML解析器来查找和替换所有文本节点。 – tucuxi
@tucuxi你能更具体一点吗?你有什么建议? –