【发布时间】:2016-11-11 09:33:24
【问题描述】:
给定一个字符串类型的 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;
}
【问题讨论】:
-
您不应使用正则表达式解析 XML 或任何其他树状语法。或者换句话说,工作的错误工具。使用 XML 解析器来定位和替换所有文本节点。
-
@tucuxi 你能再具体一点吗?你有什么建议?