匿名化xml:如何在Java中保留标签的同时删除数据?

时间:2016-11-11 09:33:25

标签: java regex xml

鉴于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;
}

2 个答案:

答案 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的部分内容。确保首先替换最后一个匹配,因为每次更换之前的部件时,后面部件的位置都会改变。