2016-11-11 44 views
-1

给定一个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; 
} 
+6

你不可解析XML或其它任何类似树的语法使用正则表达式。换句话说,这个工作是错误的工具。使用XML解析器来查找和替换所有文本节点。 – tucuxi

+0

@tucuxi你能更具体一点吗?你有什么建议? –

回答

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> 
0

这个任务是一个正则表达式有点过重。你可以使用一个正则表达式查找,包括标签的地方:

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> 

节省每个位置匹配后,你可以使用你原来的正则表达式查找的位置,以取代在子串中。添加到子字符串匹配位置的第一个匹配的开始位置将为您提供要在xmlString中进行替换的位置。

当您拥有所有职位时,您可以开始替换部分xmlString using substring。确保首先替换最后一个匹配,因为每次替换前一个部分时,后面部分的位置都会改变。